<!DOCTYPE html>
<html lang="en-US" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Kubernetes架构 | VitePress</title>
    <meta name="description" content="A VitePress site">
    <link rel="preload stylesheet" href="/notebook/assets/style.3dbfd0c2.css" as="style">
    
    <script type="module" src="/notebook/assets/app.8aaa4cbe.js"></script>
    <link rel="preload" href="/notebook/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/notebook/assets/chunks/framework.1336c4e5.js">
    <link rel="modulepreload" href="/notebook/assets/chunks/theme.20cddc0c.js">
    <link rel="modulepreload" href="/notebook/assets/云原生_K8S.md.db58e65a.lean.js">
    <script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-255ec12d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-ae3e3f51></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-ae3e3f51> Skip to content </a><!--]--><!----><header class="VPNav" data-v-255ec12d data-v-7e5bc4a5><div class="VPNavBar has-sidebar" data-v-7e5bc4a5 data-v-0937f67c><div class="container" data-v-0937f67c><div class="title" data-v-0937f67c><div class="VPNavBarTitle has-sidebar" data-v-0937f67c data-v-86d1bed8><a class="title" href="/notebook/" data-v-86d1bed8><!--[--><!--]--><!--[--><img class="VPImage logo" src="/notebook/Vue.png" alt data-v-8426fc1a><!--]--><!--[-->任硕的文档<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-0937f67c><div class="curtain" data-v-0937f67c></div><div class="content-body" data-v-0937f67c><!--[--><!--]--><div class="VPNavBarSearch search" style="--vp-meta-key:&#39;Meta&#39;;" data-v-0937f67c><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0937f67c data-v-7f418b0f><span id="main-nav-aria-label" class="visually-hidden" data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>Java学前端</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/HTML+JS.html" data-v-2f2cfafc><!--[-->HTML+JS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/CSS.html" data-v-2f2cfafc><!--[-->CSS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue2+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue2+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue3+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue3+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/React.html" data-v-2f2cfafc><!--[-->React<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>软件测试</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->测试基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95.html" data-v-2f2cfafc><!--[-->压力测试<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>多线程</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-2f2cfafc><!--[-->基础篇<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B9%B6%E5%8F%91%E5%AE%8C%E5%96%84.html" data-v-2f2cfafc><!--[-->进阶篇<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>开发工具</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/Chrome.html" data-v-2f2cfafc><!--[-->Chrome<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->IDEA基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E6%8F%92%E4%BB%B6.html" data-v-2f2cfafc><!--[-->IDEA插件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/VS%20Code.html" data-v-2f2cfafc><!--[-->VS Code<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>消息中间件</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ.html" data-v-2f2cfafc><!--[-->RabbitMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ.html" data-v-2f2cfafc><!--[-->RocketMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka.html" data-v-2f2cfafc><!--[-->Kafka<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Canal.html" data-v-2f2cfafc><!--[-->Canal<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-0937f67c data-v-f6a63727><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-f6a63727 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0937f67c data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0937f67c data-v-40855f84 data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-a7b5672a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-a7b5672a><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><!----><!--[--><!--[--><!----><div class="group" data-v-40855f84><div class="item appearance" data-v-40855f84><p class="label" data-v-40855f84>Appearance</p><div class="appearance-action" data-v-40855f84><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-40855f84 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-40855f84><div class="item social-links" data-v-40855f84><div class="VPSocialLinks social-links-list" data-v-40855f84 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0937f67c data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-255ec12d data-v-5cfd5582><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-5cfd5582><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-5cfd5582><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-5cfd5582>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-5cfd5582 data-v-18201f51><button data-v-18201f51>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-255ec12d data-v-845b8fc6><div class="curtain" data-v-845b8fc6></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-845b8fc6><span class="visually-hidden" id="sidebar-aria-label" data-v-845b8fc6> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Java</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%9B%86%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java集合</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Linux</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Shell.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Shell脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实用脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E8%BD%AF%E4%BB%B6%E9%83%A8%E7%BD%B2.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>软件部署</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Nginx</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%AE%9E%E6%88%98%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实战篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E9%9D%A2%E8%AF%95%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>面试篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SSM</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Maven.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Maven</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Spring.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Spring</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringMVC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringMVC</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringBatch.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringBatch</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringBoot</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%BA%94%E7%94%A8%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>应用篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E8%BF%90%E7%BB%B4&amp;%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>运维&原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringCloud</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringCloud</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/Sentinel.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Sentinel</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringSecurity</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Mybatis & MybatisPlus</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/Mybatis.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Mybatis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/MybatisPlus.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MybatisPlus</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/JPA.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JPA</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Git & ChatGPT</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Git.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Git</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Github.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Github</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/ChatGPT.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ChatGPT</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Jenkins.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Jenkins</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Netty.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Netty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>数据库</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MySQL</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%AE%BE%E8%AE%A1.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%90%E7%BB%B4.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL运维</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分库分表</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Redis</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis原理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>本地缓存</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MongoDB</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E6%95%B4%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>ElasticSearch</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/1%E3%80%81ES%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/3%E3%80%81ES%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/influxdb.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>InfluxDB</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Neo4j.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Neo4j</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>高并发 & 秒杀 & 分布式</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E5%88%86%E5%B8%83%E5%BC%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式理论</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式锁</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E7%A7%92%E6%9D%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>秒杀</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%8F%AF%E7%94%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高可用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%B9%B6%E5%8F%91.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高并发</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible has-active" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>云原生</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/Docker.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Docker</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/K8S.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>K8S</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>可视化 & 监控</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E5%8F%AF%E8%A7%86%E5%8C%96%E5%A4%A7%E5%B1%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>可视化大屏</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/Zabbix.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Zabbix</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>学前端</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>HTML+CSS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/HTML%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>HTML基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/CSS%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/%E7%BD%91%E9%A1%B5%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>网页进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>JS+TS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/TypeScript.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>TS基础</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>NodeJS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Vue</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E6%96%B0%E8%AF%AD%E6%B3%95.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3新语法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue2/Vue2%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小程序</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/uniapp.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>uniapp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>计算机基础</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>数据结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>操作系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>设计模式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>计算机网络</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/UML.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>UML</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%AE%97%E6%B3%95/LeetCode.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>LeetCode</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>项目实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>云尚办公</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E4%BA%91%E5%B0%9A%E5%8A%9E%E5%85%AC/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小兔鲜</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%871.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇1</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>地图</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>苍穹外卖</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>黑马头条</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E6%94%AF%E4%BB%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>支付</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目推荐</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0" data-v-845b8fc6 data-v-9b797284><!----><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/team.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>团队成员</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-255ec12d data-v-669faec9><div class="VPDoc has-sidebar has-aside" data-v-669faec9 data-v-6b87e69f><!--[--><!--]--><div class="container" data-v-6b87e69f><div class="aside" data-v-6b87e69f><div class="aside-curtain" data-v-6b87e69f></div><div class="aside-container" data-v-6b87e69f><div class="aside-content" data-v-6b87e69f><div class="VPDocAside" data-v-6b87e69f data-v-3f215769><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" data-v-3f215769 data-v-ff0f39c8><div class="content" data-v-ff0f39c8><div class="outline-marker" data-v-ff0f39c8></div><div class="outline-title" data-v-ff0f39c8>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-ff0f39c8><span class="visually-hidden" id="doc-outline-aria-label" data-v-ff0f39c8> Table of Contents for current page </span><ul class="root" data-v-ff0f39c8 data-v-d0ee3533><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-6b87e69f><div class="content-container" data-v-6b87e69f><!--[--><!--]--><!----><main class="main" data-v-6b87e69f><div style="position:relative;" class="vp-doc _notebook_%E4%BA%91%E5%8E%9F%E7%94%9F_K8S" data-v-6b87e69f><div><h1 id="kubernetes架构" tabindex="-1">Kubernetes架构 <a class="header-anchor" href="#kubernetes架构" aria-label="Permalink to &quot;Kubernetes架构&quot;">​</a></h1><p>了解Kubernetes架构的不同组件是如何组合在一起的，这样你就可以更好地诊断问题，维护健康的集群，并优化工作流</p><p>你可以使用Kubernetes编排容器。这听上去很简单，但理解这实际上意味着什么，以及如何完成完全是另一回事。如果你正在运行或管理Kubernetes集群，那么你知道Kubernetes由一台指定为控制平面的计算机和许多其他指定为工作节点的计算机组成。每一个都有一个复杂但强大的堆栈，使编排成为可能，熟悉每个组件有助于理解它们是如何工作的。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304172055125.png" alt="image-20230417205559049" style="zoom:80%;"><h2 id="控制平面组件" tabindex="-1">控制平面组件 <a class="header-anchor" href="#控制平面组件" aria-label="Permalink to &quot;控制平面组件&quot;">​</a></h2><p>你把Kubernetes安装在一个叫做控制平面的机器上。它运行Kubernetes守护程序，在启动容器和pod时与之通信。以下介绍控制平面组件。</p><h3 id="etcd" tabindex="-1">etcd <a class="header-anchor" href="#etcd" aria-label="Permalink to &quot;etcd&quot;">​</a></h3><p>etcd是一种快速、分布式、一致的键值存储，用作持久存储Kubernetes对象数据（如pod、复制控制器、秘密和服务）的后备存储。etcd是Kubernetes存储集群状态和元数据的唯一地方。与etcd直接对话的唯一组件是Kubernetes API服务器。所有其他组件通过API服务器间接向etcd读写数据。</p><p>etcd还实现了一个监视功能，它提供了一个基于事件的接口，用于异步监视密钥的更改。一旦你更改了一个密钥，监视器就会得到通知。API服务器组件严重依赖于此来获得通知，并将etcd的当前状态迁移到所需状态。</p><p>为什么etcd实例的数量应该是奇数？</p><p>在高可用性（HA）环境中，通常会有三个、五个或七个etcd实例运行，但为什么呢？因为etcd是一个分布式数据存储。可以横向扩展，但也需要确保每个实例中的数据是一致的，为此，系统需要就状态达成共识。etcd为此使用RAFT共识算法。</p><p>该算法需要多数（或仲裁）才能使集群进入下一个状态。如果只有两个ectd实例，且其中任何一个都失败，etcd集群将无法转换到新状态，因为不存在多数。如果有三个ectd实例，一个实例可能会失败，但仍有大多数实例可用于达到仲裁。</p><h3 id="api服务器" tabindex="-1">API服务器 <a class="header-anchor" href="#api服务器" aria-label="Permalink to &quot;API服务器&quot;">​</a></h3><p>API服务器是Kubernetes中唯一直接与etcd交互的组件。Kubernetes中的所有其他组件必须通过API服务器才能与集群状态一起工作，包括客户端（kubectl）。API服务器具有以下功能：</p><p>——提供在etcd中存储对象的一致方式。</p><p>——对这些对象执行验证，这样客户端就不会存储配置不当的对象（如果直接写入etcd数据存储，可能会发生这种情况）。</p><p>——提供RESTful API来创建、更新、修改或删除资源。</p><p>——提供乐观并发锁定，因此在并发更新的情况下，其他客户端永远不会覆盖对对象的更改。</p><p>——对客户端发送的请求执行身份验证和授权。它使用插件提取客户端的用户名、用户ID、用户所属的组，并确定经过身份验证的用户是否可以对请求的资源执行请求的操作。</p><p>——如果请求试图创建、修改或删除资源，则负责许可控制。例如，AlwaysPubllimages、DefaultStorageClass和ResourceQuota。</p><p>——实现一种监视机制（类似于etcd），以便客户端监视更改。这允许调度器和控制器管理器等组件以松耦合的方式与API服务器交互。</p><h3 id="控制器管理器" tabindex="-1">控制器管理器 <a class="header-anchor" href="#控制器管理器" aria-label="Permalink to &quot;控制器管理器&quot;">​</a></h3><p>在Kubernetes中，控制器是监视集群状态的控制循环，然后在需要时进行更改或请求更改。每个控制器都会尝试将当前集群状态移近所需状态。控制器跟踪至少一种Kubernetes资源类型，这些对象有一个表示所需状态的spec字段。</p><p>控制器示例：</p><p>——Replication Manager（用于ReplicationController资源的控制器）</p><p>——复制集、守护程序集和作业控制器</p><p>——部署控制器</p><p>——状态集控制器</p><p>——节点控制器</p><p>——服务控制器</p><p>——端点控制器</p><p>——命名空间控制器</p><p>——持久卷控制器</p><p>控制器使用监视机制获得更改通知。它们监视API服务器对资源的更改，并对每次更改执行操作，无论是创建新对象还是更新或删除现有对象。大多数情况下，这些操作包括创建其他资源或更新监视的资源本身。尽管如此，因为使用监视并不能保证控制器不会错过一个事件，它们也会定期执行重新列出操作，以确保没有错过任何事情。</p><p>Controller Manager还执行生命周期功能，如命名空间创建和生命周期、事件垃圾收集、终止的pod垃圾收集、级联删除垃圾收集和节点垃圾收集。</p><h3 id="调度器" tabindex="-1">调度器 <a class="header-anchor" href="#调度器" aria-label="Permalink to &quot;调度器&quot;">​</a></h3><p>调度器是一个控制平面进程，将pod分配给节点。它监视新创建的没有分配节点的pod。对于调度器发现的每一个pod，调度器将负责找到该pod运行的最佳节点。</p><p>满足pod调度要求的节点称为可行节点。如果没有合适的节点，pod将保持未调度状态，直到调度器可以放置它。一旦找到一个可行的节点，它就会运行一组函数对节点进行评分，并选择得分最高的节点。然后，它将所选节点通知API服务器。这个过程称为绑定。</p><p>节点的选择分为两步：</p><p>——筛选所有节点的列表，以获得可接受节点的列表，你可以将pod安排到这些节点（例如，PodFitsResources筛选器检查候选节点是否有足够的可用资源来满足pod的特定资源请求）。</p><p>——对从第一步获得的节点列表进行评分，并对它们进行排序，以选择最佳节点。如果多个节点得分最高，循环过程可以确保pod在所有节点上均匀部署。</p><p>调度决策考虑的因素包括：</p><p>——pod是否请求硬件/软件资源？节点是否报告内存或磁盘压力状况？</p><p>——节点是否具有与pod规范中的节点选择器匹配的标签？</p><p>——如果pod请求绑定到特定的主机端口，该端口可用吗？</p><p>——pod能容忍节点的污染吗？</p><p>——pod是否指定节点关联规则或反关联规则？</p><p>调度器不会指示所选节点运行pod。调度器只需通过API服务器更新pod定义。API服务器通知kubelet pod已通过监视机制调度。然后目标节点上的kubelet服务看到pod被调度到其节点，它创建并运行pod的容器。</p><h3 id="工作节点组件" tabindex="-1">工作节点组件 <a class="header-anchor" href="#工作节点组件" aria-label="Permalink to &quot;工作节点组件&quot;">​</a></h3><p>Worker节点运行kubelet代理，这允许它们被控制平面用来处理作业。与控制平面类似，工作节点使用几个不同的组件来实现这一点。以下介绍工作节点组件。</p><h3 id="kubelet" tabindex="-1">kubelet <a class="header-anchor" href="#kubelet" aria-label="Permalink to &quot;kubelet&quot;">​</a></h3><p>kubelet是在集群中的每个节点上运行的代理，负责在工作节点上运行的所有内容。它确保容器在pod中运行。</p><p>kubelet服务的主要功能是：</p><p>——通过在API服务器中创建节点资源来注册它正在运行的节点。</p><p>——持续监控API服务器，以查看已调度到节点的pod。</p><p>——使用配置好的容器运行时启动pod的容器。</p><p>——持续监控正在运行的容器，并向API服务器报告它们的状态、事件和资源消耗。</p><p>——运行容器活性探测，当探针失败时重新启动容器，当容器的pod从API服务器上删除时终止容器（通知服务器pod终止）。</p><h2 id="服务代理" tabindex="-1">服务代理 <a class="header-anchor" href="#服务代理" aria-label="Permalink to &quot;服务代理&quot;">​</a></h2><p>服务代理（kube-proxy）在每个节点上运行，确保一个pod可以与另一个pod对话，一个节点可以与另一个节点对话，以及一个容器可以与另一个容器对话。它负责监视API服务器上服务和pod定义的更改，以保持整个网络配置是最新的。当一个服务得到多个pod的支持时，代理在这些pod之间执行负载均衡。</p><p>kube-proxy之所以得名，是因为它最初是一个实际的代理服务器，用于接受连接并将其代理到pod。当前的实现使用iptables规则将数据包重定向到随机选择的后端pod，而不通过实际的代理服务器。</p><p>关于其工作原理的高级视图：</p><p>——创建服务时，会立即分配虚拟IP地址。</p><p>——API服务器通知在工作节点上运行的kube-proxy存在新服务。</p><p>——每个kube-proxy通过设置iptables规则使服务可寻址，确保拦截每个服务IP/端口对，并将目标地址修改为支持服务的pod之一。</p><p>——监视API服务器对服务或其端点对象的更改。</p><h2 id="容器运行时" tabindex="-1">容器运行时 <a class="header-anchor" href="#容器运行时" aria-label="Permalink to &quot;容器运行时&quot;">​</a></h2><p>有两类容器运行时：</p><p>——较低级别的容器运行时：它们关注于运行容器，并为容器设置命名空间和cgroup。</p><p>——更高级别的容器运行时（容器引擎）：它们关注格式、解包、管理、镜像共享，并为开发人员提供API。</p><p>容器运行时负责：</p><p>——从镜像注册表中提取所需的容器镜像（如果在本地不可用）。</p><p>——将镜像提取到一个写时拷贝文件系统上，并覆盖所有容器层，以创建一个合并的文件系统。</p><p>——准备容器挂载点。</p><p>——设置容器镜像中的元数据，如覆盖CMD、用户输入中的ENTRYPOINT，并设置SECCOMP规则，确保容器按预期运行</p><p>——修改内核，将隔离（如进程、网络和文件系统）分配给该容器。</p><p>——提醒内核分配一些资源限制，如CPU或内存限制。</p><p>——将系统调用（syscall）传递给内核以启动容器。</p><p>——确保SElinux/AppArmor设置正确。</p><h2 id="一起工作" tabindex="-1">一起工作 <a class="header-anchor" href="#一起工作" aria-label="Permalink to &quot;一起工作&quot;">​</a></h2><blockquote><p>系统级组件协同工作，以确保Kubernetes集群的每个部分都能实现其目的并执行其功能。有时（当你深入编辑一个YAML文件时），理解你的请求在集群中是如何被传达的可能会让你不知所措。现在，有了一张各部分如何组合在一起的视图，你可以更好地了解Kubernetes内部发生了什么，这有助于你诊断问题，维护健康的集群，并优化工作流程。</p></blockquote><h1 id="为什么用k8s" tabindex="-1">为什么用K8S <a class="header-anchor" href="#为什么用k8s" aria-label="Permalink to &quot;为什么用K8S&quot;">​</a></h1><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231007149.png" alt="image-20220723100728072" style="zoom:50%;"><p>随着k8s 作为容器编排解决方案变得越来越流行，有些人开始拿 Docker 和 k8s进行对比，不禁问道：Docker 不香吗？</p><blockquote><p>k8s 是kubernets的缩写，’8‘代表中间的八个字符。</p></blockquote><p>其实 Docker 和 k8s 并非直接的竞争对手，它俩相互依存。Docker 是一个容器化平台，而 k8s 是 Docker 等容器平台的协调器。</p><h2 id="容器化时代来了" tabindex="-1">容器化时代来了 <a class="header-anchor" href="#容器化时代来了" aria-label="Permalink to &quot;容器化时代来了&quot;">​</a></h2><p>虚拟化技术已经走过了三个时代，没有容器化技术的演进就不会有 Docker 技术的诞生。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231008346.png" alt="image-20220723100822315" style="zoom:67%;"><p>物理机时代：多个应用程序可能会跑在一台机器上。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231008325.png" alt="image-20220723100852266" style="zoom:50%;"><p>虚拟机时代：一台物理机器安装多个虚拟机（VM），一个虚拟机跑多个程序。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231009702.png" alt="image-20220723100928623" style="zoom:50%;"><p>容器化时代：一台物理机安装多个容器实例（container），一个容器跑多个程序。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231010436.png" alt="image-20220723101018353" style="zoom:45%;"><p>容器化解决了软件开发过程中一个令人非常头疼的问题，用一段对话描述：</p><blockquote><p>测试人员：你这个功能有问题。</p><p>开发人员：我本地是好的啊。</p></blockquote><p>开发人员编写代码，在自己本地环境测试完成后，将代码部署到测试或生产环境中，经常会遇到各种各样的问题。明明本地完美运行的代码为什么部署后出现很多 bug，原因有很多：不同的操作系统、不同的依赖库等，总结一句话就是因为本地环境和远程环境不一致。</p><p>容器化技术正好解决了这一关键问题，它将软件程序和运行的基础环境分开。开发人员编码完成后将程序打包到一个容器镜像中，镜像中详细列出了所依赖的环境，在不同的容器中运行标准化的镜像，从根本上解决了环境不一致的问题。</p><h2 id="容器化技术的尖刀武器" tabindex="-1">容器化技术的尖刀武器 <a class="header-anchor" href="#容器化技术的尖刀武器" aria-label="Permalink to &quot;容器化技术的尖刀武器&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231011004.png" alt="image-20220723101124940" style="zoom:50%;"><ul><li><strong>可移植性</strong>：不依赖具体的操作系统或云平台，比如在阿里云或腾讯云直接随意迁移。</li><li><strong>占地小</strong>：容器只需要其应用程序以及它需要运行的所有容器和库的依赖清单，不需要将所有的依赖库都打包在一起。</li><li><strong>共享 bin 和 lib</strong>：不同的容器可以共享 bin 和 lib，进一步节省了空间。</li></ul><h2 id="docker-横空出世" tabindex="-1">Docker 横空出世 <a class="header-anchor" href="#docker-横空出世" aria-label="Permalink to &quot;Docker 横空出世&quot;">​</a></h2><p>2010年一位年轻小伙子在美国旧金山成立了一家名叫【dotCloud】的公司， 开发了 Docker的核心技术，从此开启了容器技术的时代。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231011585.png" alt="image-20220723101152522" style="zoom:50%;"><p>后面 dotCloud 公司将自己的容器技术进行了简化和标准化，取名为 Docker，就是大家熟悉的鲸鱼 logo。</p><p>2013年dotCloud 公司宣布将 Docker 开源，随着越来越多的工程师发现了它的优点， Docker 的人气迅速攀升，成为当时最火爆的开源技术之一。</p><p>当前有30％以上的企业在其AWS环境中使用Docker，并且这个数字还在继续增长。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231012083.png" alt="image-20220723101223035" style="zoom:50%;"><h2 id="docker怎么用" tabindex="-1">Docker怎么用？ <a class="header-anchor" href="#docker怎么用" aria-label="Permalink to &quot;Docker怎么用？&quot;">​</a></h2><p>其实大多数人谈论 Docker 时说的是 Docker Engine，<code>这只是一个构建和运行的容器</code>。</p><p><code>在运行容器前需要编写Docker File，通过 dockerFile 生成镜像，然后才能运行 Docker 容器</code>。</p><p>Docker File 定义了运行镜像（image）所需的所有内容，包括操作系统和软件安装位置。一般情况下都不需要从头开始编写 Docker File，在 Docker Hub 中有来自世界各地的工程师编写好的镜像，你可以基于此修改。</p><h2 id="编排系统的需求催生-k8s" tabindex="-1">编排系统的需求催生 k8s <a class="header-anchor" href="#编排系统的需求催生-k8s" aria-label="Permalink to &quot;编排系统的需求催生 k8s&quot;">​</a></h2><p>尽管Docker为容器化的应用程序提供了开放标准，但随着容器越来越多出现了一系列新问题：</p><ul><li><code>如何协调和调度这些容器？</code></li><li><code>如何在升级应用程序时不会中断服务？</code></li><li><code>如何监视应用程序的运行状况？</code></li><li><code>如何批量重新启动容器里的程序？</code></li></ul><p>解决这些问题需要容器编排技术，可以将众多机器抽象，对外呈现出一台超大机器。现在业界比较流行的有：k8s、Mesos、Docker Swarm。</p><p>在业务发展初期只有几个微服务，这时用 Docker 就足够了，但随着业务规模逐渐扩大，容器越来越多，运维人员的工作越来越复杂，这个时候就需要编排系统解救opers。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231013117.png" alt="image-20220723101324078" style="zoom:67%;"><p>一个成熟的容器编排系统需要具备以下能力：</p><ul><li>处理大量的容器和用户</li><li>负载均衡</li><li>鉴权和安全性</li><li>管理服务通信</li><li>多平台部署</li></ul><h2 id="k8s与docker-swarm江湖恩怨" tabindex="-1">k8s与Docker Swarm江湖恩怨 <a class="header-anchor" href="#k8s与docker-swarm江湖恩怨" aria-label="Permalink to &quot;k8s与Docker Swarm江湖恩怨&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231014669.png" alt="image-20220723101439579" style="zoom:50%;"><p>如果你非要拿 Docker 和 k8s 进行比较，其实你更应该拿 Docker Swarm 和 k8s 比较。</p><p>Docker Swarm 是 Docker 自家针对集群化部署管理的解决方案，优点很明显，可以更紧密集成到 Docker 生态系统中。</p><p>虽说 Swarm 是 Docker 亲儿子，但依旧没有 k8s 流行，不流行很大程度是因为商业、生态的原因，不多解释。</p><h2 id="k8s是做什么用的" tabindex="-1">k8s是做什么用的？ <a class="header-anchor" href="#k8s是做什么用的" aria-label="Permalink to &quot;k8s是做什么用的？&quot;">​</a></h2><p><code>K8s是Google研发的容器协调器</code>，已捐赠给CNCF，现已开源。</p><p>Google 利用在容器管理多年的经验和专业知识推出了 k8s，主要用于自动化部署应用程序容器，可以支持众多容器化工具包括现在非常流行的Docker。</p><p>目前k8s 是容器编排市场的领导者，开源并公布了一系列标准化方法，主流的公有云平台都宣布支持。</p><p>一流的厂商都在抢占标准的制高点，一堆小厂商跟着一起玩，这就叫生态了。国内的大厂商都在干嘛呢？抢社区团购市场，玩资本游戏，哎？！</p><h2 id="k8s-架构和组件" tabindex="-1">K8s 架构和组件 <a class="header-anchor" href="#k8s-架构和组件" aria-label="Permalink to &quot;K8s 架构和组件&quot;">​</a></h2><p>k8s 由众多组件组成，组件间通过 API 互相通信，归纳起来主要分为三个部分：</p><ul><li>controller manager</li><li>nodes</li><li>pods</li></ul><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207231016125.png" alt="image-20220723101626051" style="zoom:50%;"><ul><li><strong>Controller Manager</strong>，即控制平面，用于调度程序以及节点状态检测。</li><li><strong>Nodes</strong>，构成了Kubernetes集群的集体计算能力，实际部署容器运行的地方。</li><li><strong>Pods</strong>，Kubernetes集群中资源的最小单位。</li></ul><h2 id="docker与k8s-难舍难分" tabindex="-1">Docker与k8s 难舍难分 <a class="header-anchor" href="#docker与k8s-难舍难分" aria-label="Permalink to &quot;Docker与k8s 难舍难分&quot;">​</a></h2><p>Docker 和 k8s 在业界非常流行，都已经是事实上的标准。</p><p>Docker 是用于构建、分发、运行容器的平台和工具。</p><p>而 k8s 实际上是一个使用 Docker 容器进行编排的系统，主要围绕 pods 进行工作。Pods 是 k8s 生态中最小的调度单位，可以包含一个或多个容器。</p><p>Docker 和 k8s 是根本上不同的技术，两者可以很好的协同工作。</p><h2 id="开发实践-灵魂追问" tabindex="-1">开发实践，灵魂追问 <a class="header-anchor" href="#开发实践-灵魂追问" aria-label="Permalink to &quot;开发实践，灵魂追问&quot;">​</a></h2><p><strong>（1）没有 k8s 可以使用 docker 吗？</strong></p><p>可以。实际上一些小型公司，在业务不太复杂的情况下都是直接使用 Docker。尽管 k8s 有很多好处，但是众所周知它非常复杂，业务比较简单可以放弃使用 k8s。</p><p><strong>（2）没有 Docker 可以使用 k8s 吗？</strong></p><p>k8s 只是一个容器编排器，没有容器拿什么编排？！</p><p>k8s 经常与 Docker 进行搭配使用，但是也可以使用其他容器，如RunC、Containerted 等。</p><p><strong>（3）Docker Swarm 和 k8s 怎么选？</strong></p><p>选 k8s。2019年底Docker Enterprise已经出售给Mirantis，Mirantis声明要逐步淘汰Docker Swarm，后续会将 k8s 作为默认编排工具。</p><h2 id="最后一个问题" tabindex="-1">最后一个问题 <a class="header-anchor" href="#最后一个问题" aria-label="Permalink to &quot;最后一个问题&quot;">​</a></h2><blockquote><p>Docker 不香吗？为什么还要用 k8s</p></blockquote><p>Docker很香，但 k8s 在业务达到一定规模后也得启用。学会了吗？</p><h1 id="k8s太火了-花10分钟玩转它不香么" tabindex="-1">K8S太火了！花10分钟玩转它不香么？ <a class="header-anchor" href="#k8s太火了-花10分钟玩转它不香么" aria-label="Permalink to &quot;K8S太火了！花10分钟玩转它不香么？&quot;">​</a></h1><blockquote><p>我的Mall电商实战项目一直使用的是Docker容器化部署，有很多朋友建议搞个Kubernetes部署。最近正好在学习Kubernetes，准备更新一波！今天我们先来学习下Kubernetes的核心概念和基本使用，希望对大家有所帮助！</p></blockquote><p>官方文档：<a href="https://kubernetes.io/zh/docs/home/" target="_blank" rel="noreferrer">https://kubernetes.io/zh/docs/home/</a></p><p><a href="https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&amp;mid=2247488842&amp;idx=1&amp;sn=259ef19f414d968748193df89a0a6c73&amp;chksm=fc2fa942cb58205472bbbec7b89192ccd0da270c48ea21556bd8cf7f1ecd54a528f8dbd5468f&amp;mpshare=1&amp;scene=23&amp;srcid=0722vTcjy5hAfIItglOZvjwf&amp;sharer_sharetime=1658503980742&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">K8S太火了！花10分钟玩转它不香么？ (qq.com)</a></p><h2 id="kubernetes简介" tabindex="-1">Kubernetes简介 <a class="header-anchor" href="#kubernetes简介" aria-label="Permalink to &quot;Kubernetes简介&quot;">​</a></h2><p>Kubernetes（简称K8S，K和S之间有8个字母）是用于自动部署，扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元，以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验，同时凝聚了社区的最佳创意和实践。</p><p>Kubernetes具有如下特性：</p><ul><li>服务发现与负载均衡：无需修改你的应用程序即可使用陌生的服务发现机制。</li><li>存储编排：自动挂载所选存储系统，包括本地存储。</li><li>Secret和配置管理：部署更新Secrets和应用程序的配置时不必重新构建容器镜像，且不必将软件堆栈配置中的秘密信息暴露出来。</li><li>批量执行：除了服务之外，Kubernetes还可以管理你的批处理和CI工作负载，在期望时替换掉失效的容器。</li><li>水平扩缩：使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行扩缩。</li><li>自动化上线和回滚：Kubernetes会分步骤地将针对应用或其配置的更改上线，同时监视应用程序运行状况以确保你不会同时终止所有实例。</li><li>自动装箱：根据资源需求和其他约束自动放置容器，同时避免影响可用性。</li><li>自我修复：重新启动失败的容器，在节点死亡时替换并重新调度容器，杀死不响应用户定义的健康检查的容器。</li></ul><h2 id="minikube简介" tabindex="-1">Minikube简介 <a class="header-anchor" href="#minikube简介" aria-label="Permalink to &quot;Minikube简介&quot;">​</a></h2><p>Minikube是一种轻量级的Kubernetes实现，可在本地计算机上创建VM并部署仅包含一个节点的简单集群，Minikube可用于Linux、MacOS和Windows系统。Minikube CLI提供了用于引导集群工作的多种操作，包括启动、停止、查看状态和删除。</p><h2 id="kubernetes核心概念" tabindex="-1">Kubernetes核心概念 <a class="header-anchor" href="#kubernetes核心概念" aria-label="Permalink to &quot;Kubernetes核心概念&quot;">​</a></h2><blockquote><p>由于Kubernetes有很多核心概念，学习它们对理解Kubernetes的使用很有帮助，所以我们先来学习下这些核心概念。</p></blockquote><h3 id="node" tabindex="-1">Node <a class="header-anchor" href="#node" aria-label="Permalink to &quot;Node&quot;">​</a></h3><p>Kubernetes集群是指Kubernetes协调一个高可用计算机集群，每个计算机作为独立单元互相连接工作。</p><p>一个Kubernetes集群包含两种类型的资源：</p><ul><li>Master：负责管理整个集群。协调集群中的所有活动，例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。</li><li>Node：用于托管正在运行的应用。可以是一个虚拟机或者物理机，它在Kubernetes集群中充当工作机器的角色，每个Node都有Kubelet，它管理Node而且是Node与Master通信的代理，Node还具有用于处理容器操作的工具，例如Docker或rkt。</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzWyrVdhuNH5MIg8s8gjgx2ubtmutjBlHW2n88OC47jMeicSpEBewSTCeg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="deployment" tabindex="-1">Deployment <a class="header-anchor" href="#deployment" aria-label="Permalink to &quot;Deployment&quot;">​</a></h3><p>Deployment负责创建和更新应用程序的实例。创建Deployment后，Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除，Deployment控制器会将该实例替换为群集中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障维护问题。</p><p>可以使用Kubernetes命令行界面Kubectl创建和管理Deployment。Kubectl使用Kubernetes API与集群进行交互。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzWNeGDnZFia1qdbQrVribjeW3O1yjHlUnhG7XARuMEwGbX3x7sGRLQiawpQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="pod" tabindex="-1">Pod <a class="header-anchor" href="#pod" aria-label="Permalink to &quot;Pod&quot;">​</a></h3><p>Pod相当于<code>逻辑主机</code>的概念，负责托管应用实例。包括一个或多个应用程序容器（如 Docker），以及这些容器的一些共享资源（共享存储、网络、运行信息等）。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzWyphAyM2ItJeVmulUv9mc4oBdFMUzrc5smwVJIjibhtMKkHk97q5WFtQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="service" tabindex="-1">Service <a class="header-anchor" href="#service" aria-label="Permalink to &quot;Service&quot;">​</a></h3><p>Service是一个抽象层，它定义了一组Pod的逻辑集，并为这些Pod支持外部流量暴露、负载平衡和服务发现。</p><p>尽管每个Pod 都有一个唯一的IP地址，但是如果没有Service，这些IP不会暴露在群集外部。Service允许您的应用程序接收流量。Service也可以用在ServiceSpec标记type的方式暴露，type类型如下：</p><ul><li>ClusterIP（默认）：在集群的内部IP上公开Service。这种类型使得Service只能从集群内访问。</li><li>NodePort：使用NAT在集群中每个选定Node的相同端口上公开Service。使用<code>&lt;NodeIP&gt;:&lt;NodePort&gt;</code>从集群外部访问Service。是ClusterIP的超集。</li><li>LoadBalancer：在当前云中创建一个外部负载均衡器(如果支持的话)，并为Service分配一个固定的外部IP。是NodePort的超集。</li><li>ExternalName：通过返回带有该名称的CNAME记录，使用任意名称（由spec中的externalName指定）公开Service。不使用代理。</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzW3M2Vo4PFZZWtlOrWCFsibvRXz3bhoakukG8F2IrnzLymx4gTjoiaticibw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="docker安装" tabindex="-1">Docker安装 <a class="header-anchor" href="#docker安装" aria-label="Permalink to &quot;Docker安装&quot;">​</a></h2><blockquote><p>由于Kubernetes运行需要依赖<code>容器运行时</code>（负责运行容器的软件），现比较通用的容器运行时有Docker、containerd和CRI-O。这里选择Docker，先在Linux服务器上安装好Docker环境。</p></blockquote><ul><li>安装<code>yum-utils</code>：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">yum</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">install</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-y</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">yum-utils</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">device-mapper-persistent-data</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">lvm2</span></span></code></pre></div><ul><li>为yum源添加docker仓库位置：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">yum-config-manager</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--add-repo</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">https://download.docker.com/linux/centos/docker-ce.repo</span></span></code></pre></div><ul><li>安装Docker：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">yum</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">install</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">docker-ce</span></span></code></pre></div><ul><li>启动Docker：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">systemctl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">start</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">docker</span></span></code></pre></div><ul><li>配置阿里云加速</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">sudo</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">mkdir</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-p</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/etc/docker</span></span>
<span class="line"><span style="color:#FFCB6B;">sudo</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">tee</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/etc/docker/daemon.json</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&lt;&lt;-</span><span style="color:#A6ACCD;">&#39;</span><span style="color:#89DDFF;">EOF</span><span style="color:#A6ACCD;">&#39;</span></span>
<span class="line"><span style="color:#C3E88D;">{</span></span>
<span class="line"><span style="color:#C3E88D;">  &quot;registry-mirrors&quot;: [&quot;https://hi7nmgjd.mirror.aliyuncs.com&quot;]</span></span>
<span class="line"><span style="color:#C3E88D;">}</span></span>
<span class="line"><span style="color:#89DDFF;">EOF</span></span>
<span class="line"><span style="color:#FFCB6B;">sudo</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">systemctl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">daemon-reload</span></span>
<span class="line"><span style="color:#FFCB6B;">sudo</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">systemctl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">restart</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">docker</span></span></code></pre></div><h2 id="minikube安装" tabindex="-1">Minikube安装 <a class="header-anchor" href="#minikube安装" aria-label="Permalink to &quot;Minikube安装&quot;">​</a></h2><p>首先我们需要下载Minikube的二进制安装包并安装：</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">curl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-LO</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64</span></span>
<span class="line"><span style="color:#FFCB6B;">sudo</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">install</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">minikube-linux-amd64</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/usr/local/bin/minikube</span></span></code></pre></div><p>然后使用如下命令启动Minikube：</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">minikube</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">start</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--force</span></span></code></pre></div><p>如果你使用的是<code>root</code>用户的话会无法启动并提示如下信息，那是因为Minikube不允许使用root权限启动，需要创建一个非root账号再启动；</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> minikube v1.16.0 on Centos 7.6.1810</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Automatically selected the docker driver</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> The </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">docker</span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> driver should not be used with root privileges.</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> If you are running minikube within a VM, consider using --driver=none:</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;">   https://minikube.sigs.k8s.io/docs/reference/drivers/none/</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FFCB6B;">X</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Exiting</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">due</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">to</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">DRV_AS_ROOT:</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">The</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">docker</span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">driver</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">should</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">not</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">be</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">used</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">with</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">root</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">privileges.</span></span></code></pre></div><ul><li>这里创建了一个属于<code>docker</code>用户组的<code>macro</code>用户，并切换到该用户；</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;"># 创建用户</span></span>
<span class="line"><span style="color:#FFCB6B;">useradd</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-u</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1024</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-g</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">docker</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">macro</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"># 设置用户密码</span></span>
<span class="line"><span style="color:#FFCB6B;">passwd</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">macro</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"># 切换用户</span></span>
<span class="line"><span style="color:#FFCB6B;">su</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">macro</span></span></code></pre></div><ul><li>再次使用<code>minikube start</code>命令启动Minikube，启动成功后会显示如下信息：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Preparing Kubernetes v1.20.0 on Docker 20.10.0 ...</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">-</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Generating</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">certificates</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">and</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">keys</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">...</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">-</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Booting</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">up</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">control</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">plane</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">...</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">-</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Configuring</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">RBAC</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">rules</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">...</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Verifying Kubernetes components...</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Enabled addons: default-storageclass, storage-provisioner</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> kubectl not found. If you need it, try: </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">minikube kubectl -- get pods -A</span><span style="color:#89DDFF;">&#39;</span></span>
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Done</span><span style="color:#89DDFF;">!</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">is</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">now</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">configured</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">to</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">use</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">minikube</span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">cluster</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">and</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">default</span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">namespace</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">by</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">default</span></span></code></pre></div><h2 id="kubernetes的使用" tabindex="-1">Kubernetes的使用 <a class="header-anchor" href="#kubernetes的使用" aria-label="Permalink to &quot;Kubernetes的使用&quot;">​</a></h2><h3 id="创建集群" tabindex="-1">创建集群 <a class="header-anchor" href="#创建集群" aria-label="Permalink to &quot;创建集群&quot;">​</a></h3><blockquote><p>通过Minikube我们可以创建一个单节点的K8S集群，集群管理Master和负责运行应用的Node都部署在此节点上。</p></blockquote><ul><li>查看Minikube的版本号：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">minikube</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">version</span></span>
<span class="line"><span style="color:#FFCB6B;">minikube</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">version:</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">v1.16.0</span></span>
<span class="line"><span style="color:#FFCB6B;">commit:</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">9</span><span style="color:#C3E88D;">f1e482427589ff8451c4723b6ba53bb9742fbb1</span></span></code></pre></div><ul><li>查看kubectl的版本号，第一次使用会直接安装kubectl：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">minikube</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">version</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202302221700977.png" alt="image-20230222170030849" style="zoom:67%;"><p>如果你想直接使用kubectl命令的话，可以将其复制到<code>/bin</code>目录下去：</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;"># 查找kubectl命令的位置</span></span>
<span class="line"><span style="color:#FFCB6B;">find</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-name</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">kubectl</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"># 找到之后复制到/bin目录下</span></span>
<span class="line"><span style="color:#FFCB6B;">cp</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/mydata/docker/volumes/minikube/_data/lib/minikube/binaries/v1.20.0/kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/bin/</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"># 直接使用kubectl命令</span></span>
<span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">version</span></span></code></pre></div><ul><li>查看集群详细信息：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">cluster-info</span></span>
<span class="line"><span style="color:#FFCB6B;">Kubernetes</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">control</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">plane</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">is</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">running</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">at</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">https://192.168.49.2:8443</span></span>
<span class="line"><span style="color:#FFCB6B;">KubeDNS</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">is</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">running</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">at</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy</span></span>
<span class="line"></span>
<span class="line"><span style="color:#FFCB6B;">To</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">further</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">debug</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">and</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">diagnose</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">cluster</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">problems,</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">use</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">kubectl cluster-info dump</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">.</span></span></code></pre></div><ul><li>查看集群中的所有Node，可以发现Minikube创建了一个单节点的简单集群：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">get</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">nodes</span></span>
<span class="line"><span style="color:#FFCB6B;">NAME</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">STATUS</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">ROLES</span><span style="color:#A6ACCD;">                  </span><span style="color:#C3E88D;">AGE</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">VERSION</span></span>
<span class="line"><span style="color:#FFCB6B;">minikube</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">Ready</span><span style="color:#A6ACCD;">    </span><span style="color:#C3E88D;">control-plane,master</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">46</span><span style="color:#C3E88D;">m</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">v1.20.0</span></span></code></pre></div><h3 id="部署应用" tabindex="-1">部署应用 <a class="header-anchor" href="#部署应用" aria-label="Permalink to &quot;部署应用&quot;">​</a></h3><blockquote><p>一旦运行了K8S集群，就可以在其上部署容器化应用程序。通过创建Deployment对象，可以指挥K8S如何创建和更新应用程序的实例。</p></blockquote><ul><li>指定好应用镜像并创建一个Deployment，这里创建一个Nginx应用：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">create</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">deployment</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">kubernetes-nginx</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--image=nginx:1.10</span></span></code></pre></div><ul><li><p>创建一个Deployment时K8S会产生如下操作：</p></li><li><ul><li>选择一个合适的Node来部署这个应用；</li><li>将该应用部署到Node上；</li><li>当应用异常关闭或删除时重新部署应用。</li></ul></li><li><p>查看所有Deployment：</p></li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">get</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">deployments</span></span>
<span class="line"><span style="color:#FFCB6B;">NAME</span><span style="color:#A6ACCD;">                  </span><span style="color:#C3E88D;">READY</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">UP-TO-DATE</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">AVAILABLE</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">AGE</span></span>
<span class="line"><span style="color:#FFCB6B;">kubernetes-nginx</span><span style="color:#A6ACCD;">      </span><span style="color:#F78C6C;">1</span><span style="color:#C3E88D;">/1</span><span style="color:#A6ACCD;">     </span><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;">            </span><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;">           </span><span style="color:#F78C6C;">21</span><span style="color:#C3E88D;">h</span></span></code></pre></div><ul><li>我们可以通过<code>kubectl proxy</code>命令创建一个代理，这样就可以通过暴露出来的接口直接访问K8S的API了，这里调用了查询K8S版本的接口；</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">macro@linux-local root</span><span style="color:#89DDFF;">]</span><span style="color:#A6ACCD;">$ kubectl proxy</span></span>
<span class="line"><span style="color:#FFCB6B;">Starting</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">to</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">serve</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">on</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">127.0</span><span style="color:#C3E88D;">.0.1:8001</span></span>
<span class="line"><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">root@linux-local </span><span style="color:#89DDFF;">~]</span><span style="color:#A6ACCD;"># curl :8001/version</span></span>
<span class="line"><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;major&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">1</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;minor&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">20</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;gitVersion&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">v1.20.0</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;gitCommit&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;gitTreeState&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">clean</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;buildDate&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">2020-12-08T17:51:19Z</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;goVersion&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">go1.15.5</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;compiler&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">gc</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">,</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;platform&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">linux/amd64</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h3 id="查看应用" tabindex="-1">查看应用 <a class="header-anchor" href="#查看应用" aria-label="Permalink to &quot;查看应用&quot;">​</a></h3><blockquote><p>通过对运行应用的Pod进行操作，可以查看容器日志，也可以执行容器内部命令。</p></blockquote><ul><li>查看K8s中所有Pod的状态：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">get</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">pods</span></span>
<span class="line"><span style="color:#FFCB6B;">NAME</span><span style="color:#A6ACCD;">                                   </span><span style="color:#C3E88D;">READY</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">STATUS</span><span style="color:#A6ACCD;">             </span><span style="color:#C3E88D;">RESTARTS</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">AGE</span></span>
<span class="line"><span style="color:#FFCB6B;">kubernetes-nginx-78bcc44665-8fnnn</span><span style="color:#A6ACCD;">      </span><span style="color:#F78C6C;">1</span><span style="color:#C3E88D;">/1</span><span style="color:#A6ACCD;">     </span><span style="color:#C3E88D;">Running</span><span style="color:#A6ACCD;">            </span><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;">          </span><span style="color:#F78C6C;">21</span><span style="color:#C3E88D;">h</span></span></code></pre></div><ul><li>查看Pod的详细状态，包括IP地址、占用端口、使用镜像等信息；</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">describe</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">pods</span></span>
<span class="line"><span style="color:#FFCB6B;">Name:</span><span style="color:#A6ACCD;">         </span><span style="color:#C3E88D;">kubernetes-nginx-78bcc44665-8fnnn</span></span>
<span class="line"><span style="color:#FFCB6B;">Namespace:</span><span style="color:#A6ACCD;">    </span><span style="color:#C3E88D;">default</span></span>
<span class="line"><span style="color:#FFCB6B;">Priority:</span><span style="color:#A6ACCD;">     </span><span style="color:#F78C6C;">0</span></span>
<span class="line"><span style="color:#FFCB6B;">Node:</span><span style="color:#A6ACCD;">         </span><span style="color:#C3E88D;">minikube/192.168.49.2</span></span>
<span class="line"><span style="color:#FFCB6B;">Start</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Time:</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">Tue,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">05</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Jan</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">2021</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">13</span><span style="color:#C3E88D;">:57:46</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">+0800</span></span>
<span class="line"><span style="color:#FFCB6B;">Labels:</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#A6ACCD;">              pod-template-hash</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">78</span><span style="color:#C3E88D;">bcc44665</span></span>
<span class="line"><span style="color:#A6ACCD;">              version</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">v1</span></span>
<span class="line"><span style="color:#FFCB6B;">Annotations:</span><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#FFCB6B;">Status:</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">Running</span></span>
<span class="line"><span style="color:#FFCB6B;">IP:</span><span style="color:#A6ACCD;">           </span><span style="color:#F78C6C;">172.17</span><span style="color:#C3E88D;">.0.7</span></span>
<span class="line"><span style="color:#FFCB6B;">IPs:</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">IP:</span><span style="color:#A6ACCD;">           </span><span style="color:#F78C6C;">172.17</span><span style="color:#C3E88D;">.0.7</span></span>
<span class="line"><span style="color:#FFCB6B;">Controlled</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">By:</span><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">ReplicaSet/kubernetes-nginx-78bcc44665</span></span>
<span class="line"><span style="color:#FFCB6B;">Containers:</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">nginx:</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Container</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">ID:</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">docker://31eb1277e507ec4cf8a27b66a9f4f30fb919d17f4cd914c09eb4cfe8322504b2</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Image:</span><span style="color:#A6ACCD;">          </span><span style="color:#C3E88D;">nginx:1.10</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Image</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">ID:</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Port:</span><span style="color:#A6ACCD;">           </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Host</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Port:</span><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">State:</span><span style="color:#A6ACCD;">          </span><span style="color:#C3E88D;">Running</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#FFCB6B;">Started:</span><span style="color:#A6ACCD;">      </span><span style="color:#C3E88D;">Wed,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">06</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Jan</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">2021</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">09</span><span style="color:#C3E88D;">:22:40</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">+0800</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Last</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">State:</span><span style="color:#A6ACCD;">     </span><span style="color:#C3E88D;">Terminated</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#FFCB6B;">Reason:</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">Completed</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#FFCB6B;">Exit</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Code:</span><span style="color:#A6ACCD;">    </span><span style="color:#F78C6C;">0</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#FFCB6B;">Started:</span><span style="color:#A6ACCD;">      </span><span style="color:#C3E88D;">Tue,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">05</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Jan</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">2021</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">14</span><span style="color:#C3E88D;">:24:55</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">+0800</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#FFCB6B;">Finished:</span><span style="color:#A6ACCD;">     </span><span style="color:#C3E88D;">Tue,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">05</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Jan</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">2021</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">17</span><span style="color:#C3E88D;">:32:48</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">+0800</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Ready:</span><span style="color:#A6ACCD;">          </span><span style="color:#C3E88D;">True</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Restart</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Count:</span><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">1</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Environment:</span><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Mounts:</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#FFCB6B;">/var/run/secrets/kubernetes.io/serviceaccount</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">from</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">default-token-dhr4b</span><span style="color:#A6ACCD;"> (ro)</span></span>
<span class="line"><span style="color:#FFCB6B;">Conditions:</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">Type</span><span style="color:#A6ACCD;">              </span><span style="color:#C3E88D;">Status</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">Initialized</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">True</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">Ready</span><span style="color:#A6ACCD;">             </span><span style="color:#C3E88D;">True</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">ContainersReady</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">True</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">PodScheduled</span><span style="color:#A6ACCD;">      </span><span style="color:#C3E88D;">True</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#FFCB6B;">Volumes:</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">default-token-dhr4b:</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Type:</span><span style="color:#A6ACCD;">        </span><span style="color:#C3E88D;">Secret</span><span style="color:#A6ACCD;"> (a </span><span style="color:#C3E88D;">volume</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">populated</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">by</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">a</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Secret</span><span style="color:#A6ACCD;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">SecretName:</span><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">default-token-dhr4b</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">Optional:</span><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">false</span></span>
<span class="line"><span style="color:#FFCB6B;">QoS</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Class:</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">BestEffort</span></span>
<span class="line"><span style="color:#FFCB6B;">Node-Selectors:</span><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#FFCB6B;">Tolerations:</span><span style="color:#A6ACCD;">     </span><span style="color:#C3E88D;">node.kubernetes.io/not-ready:NoExecute</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">op=Exists</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">300</span><span style="color:#C3E88D;">s</span></span>
<span class="line"><span style="color:#A6ACCD;">                 </span><span style="color:#FFCB6B;">node.kubernetes.io/unreachable:NoExecute</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">op=Exists</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">300</span><span style="color:#C3E88D;">s</span></span>
<span class="line"><span style="color:#FFCB6B;">Events:</span><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span></code></pre></div><ul><li>将Pod的名称设置为环境变量，方便之后使用<code>$POD_NAME</code>来应用Pod的名称：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">export</span><span style="color:#A6ACCD;"> POD_NAME</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">kubernetes-nginx-78bcc44665-8fnnn</span></span></code></pre></div><ul><li>查看Pod打印的日志：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">logs</span><span style="color:#A6ACCD;"> $POD_NAME</span></span></code></pre></div><ul><li>使用<code>exec</code>可以在Pod的容器中执行命令，这里使用<code>env</code>命令查看环境变量：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">exec</span><span style="color:#A6ACCD;"> $POD_NAME </span><span style="color:#C3E88D;">--</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">env</span></span>
<span class="line"><span style="color:#A6ACCD;">PATH</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</span></span>
<span class="line"><span style="color:#A6ACCD;">HOSTNAME</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">kubernetes-nginx-78bcc44665-8fnnn</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_PORT_443_TCP_ADDR</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">10.96</span><span style="color:#C3E88D;">.0.1</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_SERVICE_HOST</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">10.96</span><span style="color:#C3E88D;">.0.1</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_SERVICE_PORT</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">443</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_SERVICE_PORT_HTTPS</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">443</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_PORT</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">tcp://10.96.0.1:443</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_PORT_443_TCP</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">tcp://10.96.0.1:443</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_PORT_443_TCP_PROTO</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">tcp</span></span>
<span class="line"><span style="color:#A6ACCD;">KUBERNETES_PORT_443_TCP_PORT</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">443</span></span>
<span class="line"><span style="color:#A6ACCD;">NGINX_VERSION</span><span style="color:#89DDFF;">=</span><span style="color:#F78C6C;">1.10</span><span style="color:#C3E88D;">.3-1~jessie</span></span>
<span class="line"><span style="color:#A6ACCD;">HOME</span><span style="color:#89DDFF;">=</span><span style="color:#C3E88D;">/root</span></span></code></pre></div><ul><li>进入容器内部并执行<code>bash</code>命令，如果想退出容器可以使用<code>exit</code>命令：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">exec</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-ti</span><span style="color:#A6ACCD;"> $POD_NAME </span><span style="color:#C3E88D;">--</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">bash</span></span></code></pre></div><h3 id="公开暴露应用" tabindex="-1">公开暴露应用 <a class="header-anchor" href="#公开暴露应用" aria-label="Permalink to &quot;公开暴露应用&quot;">​</a></h3><blockquote><p>默认Pod无法被集群外部访问，需要创建Service并暴露端口才能被外部访问。</p></blockquote><ul><li>创建一个Service来暴露kubernetes-nginx这个Deployment：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">expose</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">deployment/kubernetes-nginx</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--type=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">NodePort</span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--port</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">80</span></span></code></pre></div><ul><li>查看K8S中所有Service的状态：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">get</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">services</span></span>
<span class="line"><span style="color:#FFCB6B;">NAME</span><span style="color:#A6ACCD;">               </span><span style="color:#C3E88D;">TYPE</span><span style="color:#A6ACCD;">        </span><span style="color:#C3E88D;">CLUSTER-IP</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">EXTERNAL-IP</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">PORT</span><span style="color:#89DDFF;">(</span><span style="color:#FFCB6B;">S</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;">        </span><span style="color:#C3E88D;">AGE</span></span>
<span class="line"><span style="color:#FFCB6B;">kubernetes</span><span style="color:#A6ACCD;">         </span><span style="color:#C3E88D;">ClusterIP</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">10.96</span><span style="color:#C3E88D;">.0.1</span><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">        </span><span style="color:#F78C6C;">443</span><span style="color:#C3E88D;">/TCP</span><span style="color:#A6ACCD;">        </span><span style="color:#F78C6C;">5</span><span style="color:#C3E88D;">h16m</span></span>
<span class="line"><span style="color:#FFCB6B;">kubernetes-nginx</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">NodePort</span><span style="color:#A6ACCD;">    </span><span style="color:#F78C6C;">10.105</span><span style="color:#C3E88D;">.177.114</span><span style="color:#A6ACCD;">   </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">        </span><span style="color:#F78C6C;">80</span><span style="color:#C3E88D;">:31891/TCP</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">5</span><span style="color:#C3E88D;">s</span></span></code></pre></div><ul><li>查看Service的详情，通过<code>NodePort</code>属性可以得到暴露到外部的端口；</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">describe</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">services/kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Name:</span><span style="color:#A6ACCD;">                     </span><span style="color:#C3E88D;">kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Namespace:</span><span style="color:#A6ACCD;">                </span><span style="color:#C3E88D;">default</span></span>
<span class="line"><span style="color:#FFCB6B;">Labels:</span><span style="color:#A6ACCD;">                   </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Annotations:</span><span style="color:#A6ACCD;">              </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#FFCB6B;">Selector:</span><span style="color:#A6ACCD;">                 </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Type:</span><span style="color:#A6ACCD;">                     </span><span style="color:#C3E88D;">NodePort</span></span>
<span class="line"><span style="color:#FFCB6B;">IP</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Families:</span><span style="color:#A6ACCD;">              </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#FFCB6B;">IP:</span><span style="color:#A6ACCD;">                       </span><span style="color:#F78C6C;">10.106</span><span style="color:#C3E88D;">.227.54</span></span>
<span class="line"><span style="color:#FFCB6B;">IPs:</span><span style="color:#A6ACCD;">                      </span><span style="color:#F78C6C;">10.106</span><span style="color:#C3E88D;">.227.54</span></span>
<span class="line"><span style="color:#FFCB6B;">Port:</span><span style="color:#A6ACCD;">                     </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">unse</span><span style="color:#A6ACCD;">t</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">80</span><span style="color:#C3E88D;">/TCP</span></span>
<span class="line"><span style="color:#FFCB6B;">TargetPort:</span><span style="color:#A6ACCD;">               </span><span style="color:#F78C6C;">80</span><span style="color:#C3E88D;">/TCP</span></span>
<span class="line"><span style="color:#FFCB6B;">NodePort:</span><span style="color:#A6ACCD;">                 </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">unse</span><span style="color:#A6ACCD;">t</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">30158</span><span style="color:#C3E88D;">/TCP</span></span>
<span class="line"><span style="color:#FFCB6B;">Endpoints:</span><span style="color:#A6ACCD;">                </span><span style="color:#F78C6C;">172.17</span><span style="color:#C3E88D;">.0.7:80</span></span>
<span class="line"><span style="color:#FFCB6B;">Session</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Affinity:</span><span style="color:#A6ACCD;">         </span><span style="color:#C3E88D;">None</span></span>
<span class="line"><span style="color:#FFCB6B;">External</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Traffic</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Policy:</span><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">Cluster</span></span>
<span class="line"><span style="color:#FFCB6B;">Events:</span><span style="color:#A6ACCD;">                   </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span></span></code></pre></div><ul><li>通过CURL命令通过<code>Minikube IP:NodePort IP</code>可以访问Nginx服务，此时将打印Nginx主页信息；</li></ul><div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">curl $(minikube ip):30158</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;!</span><span style="color:#F07178;">DOCTYPE</span><span style="color:#89DDFF;"> </span><span style="color:#C792EA;">html</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">html</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">head</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">title</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">Welcome to nginx!</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">title</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">style</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#FFCB6B;">body</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#B2CCD6;">width</span><span style="color:#89DDFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">35em</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#B2CCD6;">margin</span><span style="color:#89DDFF;">:</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#A6ACCD;"> auto</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#B2CCD6;">font-family</span><span style="color:#89DDFF;">:</span><span style="color:#A6ACCD;"> Tahoma</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> Verdana</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> Arial</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> sans-serif</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">style</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">head</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">body</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">h1</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">Welcome to nginx!</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">h1</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">p</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">If you see this page, the nginx web server is successfully installed and</span></span>
<span class="line"><span style="color:#A6ACCD;">working. Further configuration is required.</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">p</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">p</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">For online documentation and support please refer to</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">a</span><span style="color:#89DDFF;"> </span><span style="color:#C792EA;">href</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://nginx.org/</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">nginx.org</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">a</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">.</span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">br</span><span style="color:#89DDFF;">/&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">Commercial support is available at</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">a</span><span style="color:#89DDFF;"> </span><span style="color:#C792EA;">href</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://nginx.com/</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">nginx.com</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">a</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">.</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">p</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">p</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">em</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">Thank you for using nginx.</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">em</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">p</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">body</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">html</span><span style="color:#89DDFF;">&gt;</span></span></code></pre></div><h3 id="标签的使用" tabindex="-1">标签的使用 <a class="header-anchor" href="#标签的使用" aria-label="Permalink to &quot;标签的使用&quot;">​</a></h3><blockquote><p>通过给资源添加Label，可以方便地管理资源（如Deployment、Pod、Service等）。</p></blockquote><ul><li>查看Deployment中所包含的Label；</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">describe</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">deployment</span></span>
<span class="line"><span style="color:#FFCB6B;">Name:</span><span style="color:#A6ACCD;">                   </span><span style="color:#C3E88D;">kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Namespace:</span><span style="color:#A6ACCD;">              </span><span style="color:#C3E88D;">default</span></span>
<span class="line"><span style="color:#FFCB6B;">CreationTimestamp:</span><span style="color:#A6ACCD;">      </span><span style="color:#C3E88D;">Tue,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">05</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">Jan</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">2021</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">13</span><span style="color:#C3E88D;">:57:46</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">+0800</span></span>
<span class="line"><span style="color:#FFCB6B;">Labels:</span><span style="color:#A6ACCD;">                 </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Annotations:</span><span style="color:#A6ACCD;">            </span><span style="color:#C3E88D;">deployment.kubernetes.io/revision:</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1</span></span>
<span class="line"><span style="color:#FFCB6B;">Selector:</span><span style="color:#A6ACCD;">               </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">Replicas:</span><span style="color:#A6ACCD;">               </span><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">desired</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">|</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">1</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">updated</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">|</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">1</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">total</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">|</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">1</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">available</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">|</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">0</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">unavailable</span></span>
<span class="line"><span style="color:#FFCB6B;">StrategyType:</span><span style="color:#A6ACCD;">           </span><span style="color:#C3E88D;">RollingUpdate</span></span>
<span class="line"><span style="color:#FFCB6B;">MinReadySeconds:</span><span style="color:#A6ACCD;">        </span><span style="color:#F78C6C;">0</span></span>
<span class="line"><span style="color:#FFCB6B;">RollingUpdateStrategy:</span><span style="color:#A6ACCD;">  </span><span style="color:#F78C6C;">25</span><span style="color:#C3E88D;">%</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">max</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">unavailable,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">25</span><span style="color:#C3E88D;">%</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">max</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">surge</span></span></code></pre></div><ul><li>通过Label查询Pod：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">get</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">pods</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-l</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">NAME</span><span style="color:#A6ACCD;">                                </span><span style="color:#C3E88D;">READY</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">STATUS</span><span style="color:#A6ACCD;">    </span><span style="color:#C3E88D;">RESTARTS</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">AGE</span></span>
<span class="line"><span style="color:#FFCB6B;">kubernetes-nginx-78bcc44665-8fnnn</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">1</span><span style="color:#C3E88D;">/1</span><span style="color:#A6ACCD;">     </span><span style="color:#C3E88D;">Running</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">1</span><span style="color:#A6ACCD;">          </span><span style="color:#F78C6C;">21</span><span style="color:#C3E88D;">h</span></span></code></pre></div><ul><li>通过Label查询Service：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">get</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">services</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-l</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#FFCB6B;">NAME</span><span style="color:#A6ACCD;">               </span><span style="color:#C3E88D;">TYPE</span><span style="color:#A6ACCD;">       </span><span style="color:#C3E88D;">CLUSTER-IP</span><span style="color:#A6ACCD;">      </span><span style="color:#C3E88D;">EXTERNAL-IP</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">PORT</span><span style="color:#89DDFF;">(</span><span style="color:#FFCB6B;">S</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;">        </span><span style="color:#C3E88D;">AGE</span></span>
<span class="line"><span style="color:#FFCB6B;">kubernetes-nginx</span><span style="color:#A6ACCD;">   </span><span style="color:#C3E88D;">NodePort</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">10.106</span><span style="color:#C3E88D;">.227.54</span><span style="color:#A6ACCD;">   </span><span style="color:#89DDFF;">&lt;</span><span style="color:#C3E88D;">non</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">        </span><span style="color:#F78C6C;">80</span><span style="color:#C3E88D;">:30158/TCP</span><span style="color:#A6ACCD;">   </span><span style="color:#F78C6C;">4</span><span style="color:#C3E88D;">m44s</span></span></code></pre></div><ul><li>给Pod添加Label：</li></ul><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">kubectl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">label</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">pod</span><span style="color:#A6ACCD;"> $POD_NAME </span><span style="color:#C3E88D;">version=v1</span></span></code></pre></div><ul><li>查看Pod的详细信息，可以查看Label信息：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">kubectl describe pods $POD_NAME</span></span>
<span class="line"><span style="color:#A6ACCD;">Name:         kubernetes-nginx-78bcc44665-8fnnn</span></span>
<span class="line"><span style="color:#A6ACCD;">Namespace:    default</span></span>
<span class="line"><span style="color:#A6ACCD;">Priority:     0</span></span>
<span class="line"><span style="color:#A6ACCD;">Node:         minikube/192.168.49.2</span></span>
<span class="line"><span style="color:#A6ACCD;">Start Time:   Tue, 05 Jan 2021 13:57:46 +0800</span></span>
<span class="line"><span style="color:#A6ACCD;">Labels:       app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#A6ACCD;">              pod-template-hash=78bcc44665</span></span>
<span class="line"><span style="color:#A6ACCD;">              version=v1</span></span></code></pre></div><ul><li>通过Label查询Pod：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">kubectl get pods -l version=v1</span></span></code></pre></div><ul><li>通过Label删除服务：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">kubectl delete service -l app=kubernetes-nginx</span></span>
<span class="line"><span style="color:#A6ACCD;">NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE</span></span>
<span class="line"><span style="color:#A6ACCD;">kubernetes         ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP        30h</span></span></code></pre></div><h3 id="可视化管理" tabindex="-1">可视化管理 <a class="header-anchor" href="#可视化管理" aria-label="Permalink to &quot;可视化管理&quot;">​</a></h3><blockquote><p>Dashboard是基于网页的K8S用户界面。你可以使用Dashboard将容器应用部署到K8S集群中，也可以对容器应用排错，还能管理集群资源。</p></blockquote><ul><li>查看Minikube内置插件，默认情况下Dashboard插件未启用：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">minikube addons list</span></span>
<span class="line"><span style="color:#A6ACCD;">|-----------------------------|----------|--------------|</span></span>
<span class="line"><span style="color:#A6ACCD;">|         ADDON NAME          | PROFILE  |    STATUS    |</span></span>
<span class="line"><span style="color:#A6ACCD;">|-----------------------------|----------|--------------|</span></span>
<span class="line"><span style="color:#A6ACCD;">| dashboard                   | minikube | disabled     |</span></span>
<span class="line"><span style="color:#A6ACCD;">| default-storageclass        | minikube | enabled ✅   |</span></span>
<span class="line"><span style="color:#A6ACCD;">|-----------------------------|----------|--------------|</span></span></code></pre></div><ul><li>启用Dashboard插件：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">minikube addons enable dashboard</span></span></code></pre></div><ul><li>开启Dashboard，通过<code>--url</code>参数不会打开管理页面，并可以在控制台获得访问路径：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">minikube dashboard --url</span></span>
<span class="line"><span style="color:#A6ACCD;">* Verifying dashboard health ...</span></span>
<span class="line"><span style="color:#A6ACCD;">* Launching proxy ...</span></span>
<span class="line"><span style="color:#A6ACCD;">* Verifying proxy health ...</span></span>
<span class="line"><span style="color:#A6ACCD;">http://127.0.0.1:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/</span></span></code></pre></div><ul><li>要想从外部访问Dashboard，需要从使用kubectl设置代理才行，<code>--address</code>设置为你的服务器地址；</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">kubectl proxy --port=44469 --address=&#39;192.168.5.94&#39; --accept-hosts=&#39;^.*&#39; &amp;</span></span></code></pre></div><ul><li>从外部访问服务器需要开启防火墙端口；</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;"># 切换到root用户</span></span>
<span class="line"><span style="color:#A6ACCD;">su -</span></span>
<span class="line"><span style="color:#A6ACCD;"># 开启端口</span></span>
<span class="line"><span style="color:#A6ACCD;">firewall-cmd --zone=public --add-port=44469/tcp --permanent</span></span>
<span class="line"><span style="color:#A6ACCD;"># 重启防火墙</span></span>
<span class="line"><span style="color:#A6ACCD;">firewall-cmd --reload</span></span></code></pre></div><ul><li>通过如下地址即可访问Dashboard：</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">http://192.168.5.94:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/</span></span></code></pre></div><ul><li>查看K8S集群中的资源状态信息：</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzW0bSkBSbbItByTDPhL7drfPfQEW9V3GGOX1We3UuzMIeIjTpNK3pWDg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>通过yaml脚本创建K8S资源：</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzWj4khFEQ24ps8J62oibtgxbnMKmfdiaoZE181zuzbNjrupEjCcyVWlQdg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>查看K8S中所有Pod的状态信息，通过更多按钮可以查看容器日志和执行内部命令。</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwkQ4LlPvAULYdfWEpmF0gzW0VGIVmsv56qYBMch3sFDjVxQ98XOicGZYXEtKMS8EysiajUGNqWzaPIg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;">​</a></h2><p>当我们的应用需要部署在多个物理机上时，传统的做法是一个个物理机器去部署。如果我们使用了K8S的话，就可以把这些物理机认为是一个集群，只需通过K8S把应用部署到集群即可，无需关心物理机的部署细节。同时K8S提供了水平扩容、自动装箱、自动修复等功能，大大减少了应用集群化部署的工作量。</p><p><a href="https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&amp;mid=2247488983&amp;idx=1&amp;sn=90e2650a28f4506158d63923622a2c55&amp;chksm=fc2fa9dfcb5820c99d10586f69a60c7683b2c35b6c5790c36f0bc843f95ab71672ee071c54a2&amp;mpshare=1&amp;scene=23&amp;srcid=0723wLtGM4NBCoHIELsnp8Bd&amp;sharer_sharetime=1658539323002&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">自从上了K8S，项目更新都不带停机的！ (qq.com)</a></p><h1 id="kubernetes-上-java-应用的最佳实践" tabindex="-1">Kubernetes 上 Java 应用的最佳实践 <a class="header-anchor" href="#kubernetes-上-java-应用的最佳实践" aria-label="Permalink to &quot;Kubernetes 上 Java 应用的最佳实践&quot;">​</a></h1><p>在本文中，您将了解在 Kubernetes 上运行 Java 应用程序的最佳实践。大多数这些建议也适用于其他语言。但是，我正在考虑 Java 特性范围内的所有规则，并且还展示了可用于基于 JVM 的应用程序的解决方案和工具。当使用最流行的 Java 框架（如 Spring Boot 或 Quarkus）时，这些 Kubernetes 建议中的一些是设计强制的。我将向您展示如何有效地利用它们来简化开发人员的生活。</p><h2 id="_1、不要将-limit-设置得太低" tabindex="-1">1、不要将 Limit 设置得太低 <a class="header-anchor" href="#_1、不要将-limit-设置得太低" aria-label="Permalink to &quot;1、不要将 Limit 设置得太低&quot;">​</a></h2><p>我们是否应该为 Kubernetes 上的 Java 应用设置 limit ？答案似乎显而易见。有许多工具可以验证您的 Kubernetes YAML 清单，如果您没有设置 CPU 或内存 limit ，它们肯定会打印警告。不过，社区对此也有一些“热议”。这是一篇有趣的文章，不建议设置任何 CPU limit 。这是另一篇文章，作为对上一篇文章的对比，他们考虑 CPU limit 。但我们也可以针对内存 limit 开始类似的讨论。特别是在 Java 应用程序的上下文中。</p><p>然而，对于内存管理，这个命题似乎大不相同。让我们阅读另一篇文章——这次是关于内存 limit 和 request 的。简而言之，它建议始终设置内存 limit。此外，限制应与 request 相同。在 Java 应用程序的上下文中，我们可以使用 <code>-Xmx</code> 、 <code>-XX:MaxMetaspaceSize</code> 或 <code>-XX:ReservedCodeCacheSize</code> 等 JVM 参数限制内存也很重要。无论如何，从 Kubernetes 的角度来看，pod 接收它 request 的资源。Limit 与它无关。</p><p>这一切让我得出了今天的第一个建议—A—不要将你的 limit 设置得太低。即使您设置了 CPU limit ，也不应该影响您的应用程序。例如，您可能知道，即使您的 Java 应用程序在正常工作中不会消耗太多 CPU，但它需要大量 CPU 才能快速启动。对于我在 Kubernetes 上连接 MongoDB 的简单 Spring Boot 应用程序，无限制和甚至 0.5 核之间的差异是显着的。通常它在 10 秒以下开始：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudIQlbASZ24icIMd3n9Ve5pRBLTfmFP6P54qXaKwibpF8IsbPWotXtviayvdaVN7bwXE0tZGEMSLvV7A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>将 CPU limit 设置为 500 millicores ，它开始大约 30 秒：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudIQlbASZ24icIMd3n9Ve5pRice8aswv1rGc0DenKZ3cjdfBbFkJeUbDmibfYxib7AwHgNurf2aGZtt5A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>当然，我们可以找到一些例子。但我们也会在下一节中讨论它们。</p><h2 id="_2、首先考虑内存使用" tabindex="-1">2、首先考虑内存使用 <a class="header-anchor" href="#_2、首先考虑内存使用" aria-label="Permalink to &quot;2、首先考虑内存使用&quot;">​</a></h2><p>让我们只关注内存 limit 。如果您在 Kubernetes 上运行 Java 应用程序，则有两个级别的最大使用 limit ：容器和 JVM。但是，如果您没有为 JVM 指定任何设置，也有一些默认值。如果您不设置 -Xmx 参数，JVM 会将其最大堆大小设置为可用 RAM 的大约 25%。该值是根据容器内可见的内存计算的。一旦您不在容器级别设置 limit ，JVM 将看到节点的整个内存。</p><p>在 Kubernetes 上运行应用程序之前，您至少应该测量它在预期负载下消耗了多少内存。幸运的是，有一些工具可以优化在容器中运行的 Java 应用程序的内存配置。例如，Paketo Buildpacks 带有内置内存计算器，它使用公式 Heap = 总容器内存 - Non-Heap - Headroom 计算 JVM 的 -Xmx 参数。另一方面，非堆值是使用以下公式计算的：<code>Non-Heap = Direct Memory + Metaspace + Reserved Code Cache + (Thread Stack * Thread Count)</code> 。</p><p>Paketo Buildpacks 目前是构建 Spring Boot 应用程序的默认选项（使用 <code>mvn spring-boot:build-image</code> 命令）。让我们为我们的示例应用程序尝试一下。假设我们将内存限制设置为 512M，它将在 130M 的级别计算 -Xmx 。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudIQlbASZ24icIMd3n9Ve5pR1g5y5PZyxwSwEYWia85WLtDR88jvKydw6WaZXeAEiadViaEicIc5kNIPgQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>我的应用程序可以吗？我至少应该执行一些负载测试来验证我的应用程序在高流量下的性能。但再一次 - 不要将 limit 设置得太低。例如，对于 1024M 限制， -Xmx 等于 650M。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudIQlbASZ24icIMd3n9Ve5pRDw0ibWF3ZtTBBiaeHh8DnjoCutSdjvIsUeOV1kg4ibpxFTwbqwj2lYy8A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>如您所见，我们使用 JVM 参数处理内存使用情况。它可以防止我们在第一节提到的文章中描述的 OOM kills 。因此，将 request 设置为与 limit 相同的级别并没有太大意义。我建议将其设置为比正常使用高一点——比方说多 20%。</p><h2 id="_3、适当的-liveness-和-readiness-探针" tabindex="-1">3、适当的 liveness 和 readiness 探针 <a class="header-anchor" href="#_3、适当的-liveness-和-readiness-探针" aria-label="Permalink to &quot;3、适当的 liveness 和 readiness 探针&quot;">​</a></h2><h3 id="_3-1-介绍" tabindex="-1">3.1 介绍 <a class="header-anchor" href="#_3-1-介绍" aria-label="Permalink to &quot;3.1 介绍&quot;">​</a></h3><p>了解 Kubernetes 中的 liveness 和 readiness 探针之间的区别至关重要。如果这两个探针都没有仔细实施，它们可能会降低服务的整体运行，例如导致不必要的重启。第三种类型的探针，启动探针，是 Kubernetes 中一个相对较新的特性。它允许我们避免在 liveness 或 readiness 探针上设置 initialDelaySeconds ，因此如果您的应用程序启动需要很长时间，它特别有用。有关 Kubernetes 探针的一般和最佳实践的更多详细信息，我可以推荐那篇非常有趣的文章。</p><p>Liveness 探针用于决定是否重启容器。如果应用程序因任何原因不可用，有时重启容器是有意义的。另一方面，readiness 探针用于确定容器是否可以处理传入流量。如果一个 pod 被识别为未就绪，它将被从负载平衡中移除。readiness 探针失败不会导致 pod 重启。Web 应用程序最典型的 liveness 或 readiness 探针是通过 HTTP 端点实现的。</p><p>由于 liveness 探针的后续失败会导致 pod 重新启动，因此它不应检查您的应用程序集成的可用性。这些事情应该由 readiness 验证。</p><h3 id="_3-2-配置详情" tabindex="-1">3.2 配置详情 <a class="header-anchor" href="#_3-2-配置详情" aria-label="Permalink to &quot;3.2 配置详情&quot;">​</a></h3><p>好消息是，最流行的 Java 框架（如 Spring Boot 或 Quarkus）提供了两种 Kubernetes 探针的自动配置实现。他们遵循最佳实践，因此我们通常不必了解基础知识。但是，在 Spring Boot 中，除了包含 Actuator 模块之外，您还需要使用以下属性启用它们：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">management:</span></span>
<span class="line"><span style="color:#A6ACCD;">  endpoint: </span></span>
<span class="line"><span style="color:#A6ACCD;">    health:</span></span>
<span class="line"><span style="color:#A6ACCD;">      probes:</span></span>
<span class="line"><span style="color:#A6ACCD;">        enabled: true</span></span></code></pre></div><p>由于 Spring Boot Actuator 提供了多个端点（例如 metric、 trace），因此最好将其公开在与默认端口不同的端口（通常为 8080 ）。当然，同样的规则也适用于其他流行的 Java 框架。另一方面，一个好的做法是检查您的主要应用程序端口——尤其是在 readiness 探针中。</p><p>因为它定义了我们的应用程序是否准备好处理传入的请求，所以它也应该在主端口上监听。它与 liveness probe 看起来正好相反。如果整个工作线程池都很忙，我不想重新启动我的应用程序。我只是不想在一段时间内收到传入流量。</p><p>我们还可以自定义 Kubernetes 探针的其他方面。假设我们的应用程序连接到外部系统，但我们没有在我们的 readiness 探针中验证该集成。它并不重要，不会对我们的运营状态产生直接影响。这是一个配置，它允许我们在探针中仅包含选定的集成集 (1)，并在主服务器端口上公开 readiness 情况 (2) 。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">spring:</span></span>
<span class="line"><span style="color:#A6ACCD;">  application:</span></span>
<span class="line"><span style="color:#A6ACCD;">    name: sample-spring-boot-on-kubernetes</span></span>
<span class="line"><span style="color:#A6ACCD;">  data:</span></span>
<span class="line"><span style="color:#A6ACCD;">    mongodb:</span></span>
<span class="line"><span style="color:#A6ACCD;">      host: ${MONGO_URL}</span></span>
<span class="line"><span style="color:#A6ACCD;">      port: 27017</span></span>
<span class="line"><span style="color:#A6ACCD;">      username: ${MONGO_USERNAME}</span></span>
<span class="line"><span style="color:#A6ACCD;">      password: ${MONGO_PASSWORD}</span></span>
<span class="line"><span style="color:#A6ACCD;">      database: ${MONGO_DATABASE}</span></span>
<span class="line"><span style="color:#A6ACCD;">      authentication-database: admin</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">management:</span></span>
<span class="line"><span style="color:#A6ACCD;">  endpoint.health:</span></span>
<span class="line"><span style="color:#A6ACCD;">    show-details: always</span></span>
<span class="line"><span style="color:#A6ACCD;">    group:</span></span>
<span class="line"><span style="color:#A6ACCD;">      readiness:</span></span>
<span class="line"><span style="color:#A6ACCD;">        include: mongo # (1)</span></span>
<span class="line"><span style="color:#A6ACCD;">        additional-path: server:/readiness # (2)</span></span>
<span class="line"><span style="color:#A6ACCD;">    probes:</span></span>
<span class="line"><span style="color:#A6ACCD;">      enabled: true</span></span>
<span class="line"><span style="color:#A6ACCD;">  server:</span></span>
<span class="line"><span style="color:#A6ACCD;">    port: 8081</span></span></code></pre></div><p>几乎没有任何应用可以不依赖外部解决方案（如数据库、消息代理或其他应用程序）。在配置 readiness 探针时，我们应该仔细考虑到该系统的连接设置。首先你应该考虑外部服务不可用的情况。你将如何处理？我建议将这些超时减少到较低的值，如下所示。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">spring:</span></span>
<span class="line"><span style="color:#A6ACCD;">  application:</span></span>
<span class="line"><span style="color:#A6ACCD;">    name: sample-spring-kotlin-microservice</span></span>
<span class="line"><span style="color:#A6ACCD;">  datasource:</span></span>
<span class="line"><span style="color:#A6ACCD;">    url: jdbc:postgresql://postgres:5432/postgres</span></span>
<span class="line"><span style="color:#A6ACCD;">    username: postgres</span></span>
<span class="line"><span style="color:#A6ACCD;">    password: postgres123</span></span>
<span class="line"><span style="color:#A6ACCD;">    hikari:</span></span>
<span class="line"><span style="color:#A6ACCD;">      connection-timeout: 2000</span></span>
<span class="line"><span style="color:#A6ACCD;">      initialization-fail-timeout: 0</span></span>
<span class="line"><span style="color:#A6ACCD;">  jpa:</span></span>
<span class="line"><span style="color:#A6ACCD;">    database-platform: org.hibernate.dialect.PostgreSQLDialect</span></span>
<span class="line"><span style="color:#A6ACCD;">  rabbitmq:</span></span>
<span class="line"><span style="color:#A6ACCD;">    host: rabbitmq</span></span>
<span class="line"><span style="color:#A6ACCD;">    port: 5672</span></span>
<span class="line"><span style="color:#A6ACCD;">    connection-timeout: 2000</span></span></code></pre></div><h2 id="_4、选择合适的-jdk" tabindex="-1">4、选择合适的 JDK <a class="header-anchor" href="#_4、选择合适的-jdk" aria-label="Permalink to &quot;4、选择合适的 JDK&quot;">​</a></h2><p>如果您已经使用 Dockerfile 构建了镜像，那么您可能使用的是来自 Docker Hub 的官方 OpenJDK 基础镜像。然而，目前，镜像网站上的公告称它已被正式弃用，所有用户都应该找到合适的替代品。我想这可能会让人很困惑，所以你会在这里找到对原因的详细解释。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudIQlbASZ24icIMd3n9Ve5pRSV456OgKiaI9uX0zbJqJp1ia4T4cQ1Vyhdz3H1aTyezc6QSyOdibpKHdA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>好吧，让我们考虑一下我们应该选择哪个备选方案。不同的供应商提供多种替代品。如果您正在寻找它们之间的详细比较，您应该访问以下站点。17版本推荐使用 Eclipse Temurin。</p><p>另一方面，Jib 或 Cloud Native Buildpacks 等最流行的镜像构建工具会自动为您选择供应商。默认情况下，Jib 使用 Eclipse Temurin，而 Paketo Buildpacks 使用 Bellsoft Liberica 实现。当然，您可以轻松地覆盖这些设置。我认为，例如，如果您在与 JDK 提供程序（如 AWS 和 Amazon Corretto）匹配的环境中运行您的应用程序，这可能是有意义的。</p><p>假设我们使用 Paketo Buildpacks 和 Skaffold 在 Kubernetes 上部署 Java 应用程序。为了将默认的 Bellsoft Liberica buildpack 替换为另一个，我们只需要在 buildpacks 部分中逐字设置它。下面是一个利用 Amazon Corretto buildpack 的示例。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">apiVersion: skaffold/v2beta22</span></span>
<span class="line"><span style="color:#A6ACCD;">kind: Config</span></span>
<span class="line"><span style="color:#A6ACCD;">metadata:</span></span>
<span class="line"><span style="color:#A6ACCD;">  name: sample-spring-boot-on-kubernetes</span></span>
<span class="line"><span style="color:#A6ACCD;">build:</span></span>
<span class="line"><span style="color:#A6ACCD;">  artifacts:</span></span>
<span class="line"><span style="color:#A6ACCD;">    - image: piomin/sample-spring-boot-on-kubernetes</span></span>
<span class="line"><span style="color:#A6ACCD;">      buildpacks:</span></span>
<span class="line"><span style="color:#A6ACCD;">        builder: paketobuildpacks/builder:base</span></span>
<span class="line"><span style="color:#A6ACCD;">        buildpacks:</span></span>
<span class="line"><span style="color:#A6ACCD;">          - paketo-buildpacks/amazon-corretto</span></span>
<span class="line"><span style="color:#A6ACCD;">          - paketo-buildpacks/java</span></span>
<span class="line"><span style="color:#A6ACCD;">        env:</span></span>
<span class="line"><span style="color:#A6ACCD;">          - BP_JVM_VERSION=17</span></span></code></pre></div><p>我们还可以使用不同的 JDK 供应商轻松测试我们的应用程序的性能。如果您正在寻找此类比较的示例，您可以阅读我描述此类测试和结果的文章。我使用几个可用的 Paketo Java 构建包测量了与 Mongo 数据库交互的 Spring Boot 3 应用程序的不同 JDK 性能。</p><h2 id="_5、考虑迁移到原生编译" tabindex="-1">5、考虑迁移到原生编译 <a class="header-anchor" href="#_5、考虑迁移到原生编译" aria-label="Permalink to &quot;5、考虑迁移到原生编译&quot;">​</a></h2><p>原生编译是 Java 世界中真正的“游戏规则改变者”。但我敢打赌，你们中没有多少人使用它——尤其是在生产中。当然，在将现有应用程序迁移到本机编译的过程中存在（现在仍然存在）许多挑战。GraalVM 在构建期间执行的静态代码分析可能会导致类似 ClassNotFound 或 MethodNotFound 的错误。为了克服这些挑战，我们需要提供一些提示让 GraalVM 了解代码的动态元素。这些提示的数量通常取决于库的数量和应用程序中使用的语言功能的一般数量。</p><p>像 Quarkus 或 Micronaut 这样的 Java 框架试图通过设计解决与原生编译相关的挑战。例如，他们尽可能避免使用反射。Spring Boot 还通过 Spring Native 项目大大改进了原生编译支持。因此，我在这方面的建议是，如果您要创建一个新的应用程序，请按照为本机编译做好准备的方式进行准备。例如，使用 Quarkus，您可以简单地生成一个 Maven 配置，其中包含用于构建原生可执行文件的专用配置文件。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;profiles&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;profile&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;id&gt;native&lt;/id&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;activation&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;property&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;name&gt;native&lt;/name&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;/property&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/activation&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;properties&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;skipITs&gt;false&lt;/skipITs&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;quarkus.package.type&gt;native&lt;/quarkus.package.type&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/properties&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;/profile&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/profiles&gt;</span></span></code></pre></div><p>添加后，您可以使用以下命令进行本机构建：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">$ mvn clean package -Pnative</span></span></code></pre></div><p>然后你可以分析在构建过程中是否有任何问题。即使您现在不在生产环境中运行原生应用程序（例如您的组织不批准它），您也应该将 GraalVM 编译作为您接受管道中的一个步骤。您可以使用最流行的框架轻松地为您的应用程序构建 Java 原生镜像。例如，使用 Spring Boot，您只需在 Maven pom.xml 中提供以下配置，如下所示：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;plugin&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;executions&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;execution&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;goals&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;goal&gt;build-info&lt;/goal&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;goal&gt;build-image&lt;/goal&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;/goals&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/execution&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;/executions&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;configuration&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;image&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;builder&gt;paketobuildpacks/builder:tiny&lt;/builder&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;env&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;BP_NATIVE_IMAGE&gt;true&lt;/BP_NATIVE_IMAGE&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;BP_NATIVE_IMAGE_BUILD_ARGUMENTS&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          --allow-incomplete-classpath</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;/BP_NATIVE_IMAGE_BUILD_ARGUMENTS&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;/env&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/image&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;/configuration&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/plugin&gt;</span></span></code></pre></div><h2 id="_6、正确配置日志记录" tabindex="-1">6、正确配置日志记录 <a class="header-anchor" href="#_6、正确配置日志记录" aria-label="Permalink to &quot;6、正确配置日志记录&quot;">​</a></h2><p>在编写 Java 应用程序时，日志记录可能不是您首先考虑的事情。然而，在全局范围内，它变得非常重要，因为我们需要能够收集、存储数据，并最终快速搜索和呈现特定条目。最佳做法是将应用程序日志写入标准输出 (stdout) 和标准错误 (stderr) 流。Fluentd 是一种流行的开源日志聚合器，它允许您从 Kubernetes 集群收集日志、处理它们，然后将它们发送到您选择的数据存储后端。它与 Kubernetes 部署无缝集成。</p><p>Fluentd 尝试将数据结构化为 JSON 以统一不同来源和目的地的日志记录。假设那样，最好的方法可能是以这种格式准备日志。使用 JSON 格式，我们还可以轻松地包含用于标记日志的附加字段，然后使用各种条件在可视化工具中轻松搜索它们。</p><p>为了将我们的日志格式化为 Fluentd 可读的 JSON，我们可以在 Maven 依赖项中包含 Logstash Logback 编码器库。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;dependency&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   &lt;groupId&gt;net.logstash.logback&lt;/groupId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   &lt;artifactId&gt;logstash-logback-encoder&lt;/artifactId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   &lt;version&gt;7.2&lt;/version&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/dependency&gt;</span></span></code></pre></div><p>然后我们只需要在文件 logback-spring.xml 中为我们的 Spring Boot 应用程序设置一个默认的控制台日志 Appender 。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;configuration&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;appender name=&quot;consoleAppender&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;encoder class=&quot;net.logstash.logback.encoder.LogstashEncoder&quot;/&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/appender&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;logger name=&quot;jsonLogger&quot; additivity=&quot;false&quot; level=&quot;DEBUG&quot;&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;appender-ref ref=&quot;consoleAppender&quot;/&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/logger&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;root level=&quot;INFO&quot;&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        &lt;appender-ref ref=&quot;consoleAppender&quot;/&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/root&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/configuration&gt;</span></span></code></pre></div><p>我们是否应该避免使用额外的日志 appenders ，而只是将日志打印到标准输出？根据我的经验，答案是——不。您仍然可以使用其他机制来发送日志。特别是如果您使用不止一种工具来收集组织中的日志——例如 Kubernetes 上的内部堆栈和外部的全局堆栈。</p><p>就个人而言，我正在使用一种工具来帮助我解决性能问题，例如消息代理作为代理。在 Spring Boot 中，我们可以轻松地使用 RabbitMQ。只需包括以下 starter：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;dependency&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;artifactId&gt;spring-boot-starter-amqp&lt;/artifactId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/dependency&gt;</span></span></code></pre></div><p>然后你需要在 logback-spring.xml 中提供一个类似的 appender 配置：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;configuration&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;springProperty name=&quot;destination&quot; source=&quot;app.amqp.url&quot; /&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;appender name=&quot;AMQP&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">    class=&quot;org.springframework.amqp.rabbit.logback.AmqpAppender&quot;&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;layout&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;pattern&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  &quot;time&quot;: &quot;%date{ISO8601}&quot;,</span></span>
<span class="line"><span style="color:#A6ACCD;">  &quot;thread&quot;: &quot;%thread&quot;,</span></span>
<span class="line"><span style="color:#A6ACCD;">  &quot;level&quot;: &quot;%level&quot;,</span></span>
<span class="line"><span style="color:#A6ACCD;">  &quot;class&quot;: &quot;%logger{36}&quot;,</span></span>
<span class="line"><span style="color:#A6ACCD;">  &quot;message&quot;: &quot;%message&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span>
<span class="line"><span style="color:#A6ACCD;">      &lt;/pattern&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;/layout&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;addresses&gt;${destination}&lt;/addresses&gt;  </span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;applicationId&gt;api-service&lt;/applicationId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;routingKeyPattern&gt;logs&lt;/routingKeyPattern&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;declareExchange&gt;true&lt;/declareExchange&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;exchangeName&gt;ex_logstash&lt;/exchangeName&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;/appender&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;root level=&quot;INFO&quot;&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    &lt;appender-ref ref=&quot;AMQP&quot; /&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  &lt;/root&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/configuration&gt;</span></span></code></pre></div><h2 id="_7、创建集成测试" tabindex="-1">7、创建集成测试 <a class="header-anchor" href="#_7、创建集成测试" aria-label="Permalink to &quot;7、创建集成测试&quot;">​</a></h2><p>好的，我知道——它与 Kubernetes 没有直接关系。但是由于我们使用 Kubernetes 来管理和编排容器，我们还应该对容器进行集成测试。幸运的是，使用 Java 框架，我们可以大大简化该过程。</p><p>例如，Quarkus 允许我们用 <code>@QuarkusIntegrationTest</code> 注释测试。结合 Quarkus 容器构建功能，它是一个非常强大的解决方案。我们可以针对包含该应用程序的已构建镜像运行测试。首先，让我们包含 Quarkus Jib 模块：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">&lt;dependency&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   &lt;groupId&gt;io.quarkus&lt;/groupId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   &lt;artifactId&gt;quarkus-container-image-jib&lt;/artifactId&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">&lt;/dependency&gt;</span></span></code></pre></div><p>然后我们必须通过在 application.properties 文件中将 <code>quarkus.container-image.build</code> 属性设置为 true 来启用容器构建。在测试类中，我们可以使用 <code>@TestHTTPResource</code> 和 <code>@TestHTTPEndpoint</code> 注解注入测试服务器 URL。</p><p>然后我们使用 <code>RestClientBuilder</code> 创建一个客户端并调用在容器上启动的服务。测试类的名</p><p>字不是偶然的。为了被自动检测为集成测试，它有 IT 后缀。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">@QuarkusIntegrationTest</span></span>
<span class="line"><span style="color:#A6ACCD;">public class EmployeeControllerIT {</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @TestHTTPEndpoint(EmployeeController.class)</span></span>
<span class="line"><span style="color:#A6ACCD;">    @TestHTTPResource</span></span>
<span class="line"><span style="color:#A6ACCD;">    URL url;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Test</span></span>
<span class="line"><span style="color:#A6ACCD;">    void add() {</span></span>
<span class="line"><span style="color:#A6ACCD;">        EmployeeService service = RestClientBuilder.newBuilder()</span></span>
<span class="line"><span style="color:#A6ACCD;">                .baseUrl(url)</span></span>
<span class="line"><span style="color:#A6ACCD;">                .build(EmployeeService.class);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Employee employee = new Employee(1L, 1L, &quot;Josh Stevens&quot;, </span></span>
<span class="line"><span style="color:#A6ACCD;">                                         23, &quot;Developer&quot;);</span></span>
<span class="line"><span style="color:#A6ACCD;">        employee = service.add(employee);</span></span>
<span class="line"><span style="color:#A6ACCD;">        assertNotNull(employee.getId());</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Test</span></span>
<span class="line"><span style="color:#A6ACCD;">    public void findAll() {</span></span>
<span class="line"><span style="color:#A6ACCD;">        EmployeeService service = RestClientBuilder.newBuilder()</span></span>
<span class="line"><span style="color:#A6ACCD;">                .baseUrl(url)</span></span>
<span class="line"><span style="color:#A6ACCD;">                .build(EmployeeService.class);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Set&lt;Employee&gt; employees = service.findAll();</span></span>
<span class="line"><span style="color:#A6ACCD;">        assertTrue(employees.size() &gt;= 3);</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Test</span></span>
<span class="line"><span style="color:#A6ACCD;">    public void findById() {</span></span>
<span class="line"><span style="color:#A6ACCD;">        EmployeeService service = RestClientBuilder.newBuilder()</span></span>
<span class="line"><span style="color:#A6ACCD;">                .baseUrl(url)</span></span>
<span class="line"><span style="color:#A6ACCD;">                .build(EmployeeService.class);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Employee employee = service.findById(1L);</span></span>
<span class="line"><span style="color:#A6ACCD;">        assertNotNull(employee.getId());</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><p>您可以在我之前关于使用 Quarkus 进行高级测试的文章中找到有关该过程的更多详细信息。最终效果如下图所示。当我们在构建期间使用 <code>mvn clean verify</code> 命令运行测试时，我们的测试在构建容器镜像后执行。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbudIQlbASZ24icIMd3n9Ve5pR0ibjf41gIcL8MoRZVvkmmtA4zUXzFoNnQ3E0ib2rN2OCmqcUWYcIE3cA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>该 Quarkus 功能基于 Testcontainers 框架。我们还可以将 Testcontainer 与 Spring Boot 一起使用。这是 Spring REST 应用程序及其与 PostgreSQL 数据库集成的示例测试。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)</span></span>
<span class="line"><span style="color:#A6ACCD;">@Testcontainers</span></span>
<span class="line"><span style="color:#A6ACCD;">@TestMethodOrder(MethodOrderer.OrderAnnotation.class)</span></span>
<span class="line"><span style="color:#A6ACCD;">public class PersonControllerTests {</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Autowired</span></span>
<span class="line"><span style="color:#A6ACCD;">    TestRestTemplate restTemplate;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Container</span></span>
<span class="line"><span style="color:#A6ACCD;">    static PostgreSQLContainer&lt;?&gt; postgres = </span></span>
<span class="line"><span style="color:#A6ACCD;">       new PostgreSQLContainer&lt;&gt;(&quot;postgres:15.1&quot;)</span></span>
<span class="line"><span style="color:#A6ACCD;">            .withExposedPorts(5432);</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @DynamicPropertySource</span></span>
<span class="line"><span style="color:#A6ACCD;">    static void registerMySQLProperties(DynamicPropertyRegistry registry) {</span></span>
<span class="line"><span style="color:#A6ACCD;">        registry.add(&quot;spring.datasource.url&quot;, postgres::getJdbcUrl);</span></span>
<span class="line"><span style="color:#A6ACCD;">        registry.add(&quot;spring.datasource.username&quot;, postgres::getUsername);</span></span>
<span class="line"><span style="color:#A6ACCD;">        registry.add(&quot;spring.datasource.password&quot;, postgres::getPassword);</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Test</span></span>
<span class="line"><span style="color:#A6ACCD;">    @Order(1)</span></span>
<span class="line"><span style="color:#A6ACCD;">    void add() {</span></span>
<span class="line"><span style="color:#A6ACCD;">        Person person = Instancio.of(Person.class)</span></span>
<span class="line"><span style="color:#A6ACCD;">                .ignore(Select.field(&quot;id&quot;))</span></span>
<span class="line"><span style="color:#A6ACCD;">                .create();</span></span>
<span class="line"><span style="color:#A6ACCD;">        person = restTemplate.postForObject(&quot;/persons&quot;, person, Person.class);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Assertions.assertNotNull(person);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Assertions.assertNotNull(person.getId());</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    @Test</span></span>
<span class="line"><span style="color:#A6ACCD;">    @Order(2)</span></span>
<span class="line"><span style="color:#A6ACCD;">    void updateAndGet() {</span></span>
<span class="line"><span style="color:#A6ACCD;">        final Integer id = 1;</span></span>
<span class="line"><span style="color:#A6ACCD;">        Person person = Instancio.of(Person.class)</span></span>
<span class="line"><span style="color:#A6ACCD;">                .set(Select.field(&quot;id&quot;), id)</span></span>
<span class="line"><span style="color:#A6ACCD;">                .create();</span></span>
<span class="line"><span style="color:#A6ACCD;">        restTemplate.put(&quot;/persons&quot;, person);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Person updated = restTemplate.getForObject(&quot;/persons/{id}&quot;, Person.class, id);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Assertions.assertNotNull(updated);</span></span>
<span class="line"><span style="color:#A6ACCD;">        Assertions.assertNotNull(updated.getId());</span></span>
<span class="line"><span style="color:#A6ACCD;">        Assertions.assertEquals(id, updated.getId());</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><h1 id="docker-和-k8s" tabindex="-1">docker 和 k8s <a class="header-anchor" href="#docker-和-k8s" aria-label="Permalink to &quot;docker 和 k8s&quot;">​</a></h1><p>2010年，几个搞IT的年轻人，在美国旧金山成立了一家名叫“dotCloud”的公司。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdWEfzwIQ5DX0ZUHaIpQbwLjHvcmkWpfuEmFGysgzINC6l4GE4NgycgA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>这家公司主要提供基于PaaS的云计算技术服务。具体来说，是和LXC有关的容器技术。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdibnIYP37BdjazXE6JsiblhtuqvHUelAXmaQ6NIicZ4y5j3B1EjLa6SWOA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>LXC，就是Linux容器虚拟技术（Linux container）</p><p>后来，dotCloud公司将自己的容器技术进行了简化和标准化，并命名为——Docker。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdUgH4VlIxgFEdaFsc9OVRg2S7UxJgT6e1C75ThFAHFDOYeqq6b6mjBg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>Docker技术诞生之后，并没有引起行业的关注。而dotCloud公司，作为一家小型创业企业，在激烈的竞争之下，也步履维艰。</p><p>正当他们快要坚持不下去的时候，脑子里蹦出了“开源”的想法。</p><p>什么是“开源”？开源，就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人，然后让大家一起参与进来，贡献代码和意见。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdvpjufD355ASUibrdzricDCPIx4qQibiaF6Xdx1npic5ia3jT3l4T4lmTMspw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>Open Source，开源</p><p>有的软件是一开始就开源的。也有的软件，是混不下去，创造者又不想放弃，所以选择开源。自己养不活，就吃“百家饭”嘛。</p><p>2013年3月，dotCloud公司的创始人之一，Docker之父，28岁的Solomon Hykes正式决定，将Docker项目开源。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd6SGWHIxAXmiakicO43yzTHTdp0H9v5SorhVO4puwNreR2qoibwMkNJ9NA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>不开则已，一开惊人。</p><p>越来越多的IT工程师发现了Docker的优点，然后蜂拥而至，加入Docker开源社区。</p><p>Docker的人气迅速攀升，速度之快，令人瞠目结舌。</p><p>开源当月，Docker 0.1 版本发布。此后的每一个月，Docker都会发布一个版本。到2014年6月9日，Docker 1.0 版本正式发布。</p><p>此时的Docker，已经成为行业里人气最火爆的开源技术，没有之一。甚至像Google、微软、Amazon、VMware这样的巨头，都对它青睐有加，表示将全力支持。</p><p>Docker火了之后，dotCloud公司干脆把公司名字也改成了Docker Inc. 。</p><p>Docker和容器技术为什么会这么火爆？说白了，就是因为它“轻”。</p><p>在容器技术之前，业界的网红是虚拟机。虚拟机技术的代表，是VMWare和OpenStack。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd8clroKZH0ZZCkvBIicDfmWOmVQ2pdsaEyXJCMo66QvYQuO0xtqYQgNQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>相信很多人都用过虚拟机。虚拟机，就是在你的操作系统里面，装一个软件，然后通过这个软件，再模拟一台甚至多台“子电脑”出来。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdBawficrQrGo9M8IkibdNWp9uLWYKxaNl7uBIubCS9c3pCicxT4yj8lVAw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>虚拟机，类似于“子电脑”</p><p>在“子电脑”里，你可以和正常电脑一样运行程序，例如开QQ。如果你愿意，你可以变出好几个“子电脑”，里面都开上QQ。“子电脑”和“子电脑”之间，是相互隔离的，互不影响。</p><p>虚拟机属于虚拟化技术。而Docker这样的容器技术，也是虚拟化技术，属于轻量级的虚拟化。</p><p>虚拟机虽然可以隔离出很多“子电脑”，但占用空间更大，启动更慢，虚拟机软件可能还要花钱（例如VMWare）。</p><p>而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统，只需要虚拟一个小规模的环境（类似“沙箱”）。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdZKib3nmpVUCKqnslxt2xvCSDDsAlbSd8BG9uanx79m2SgcmOFQD5auw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>它启动时间很快，几秒钟就能完成。而且，它对资源的利用率很高（一台主机可以同时运行几千个Docker容器）。此外，它占的空间很小，虚拟机一般要几GB到几十GB的空间，而容器只需要MB级甚至KB级。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdwasPlRDV398HicHwKVTHqDicnmHBJqBk6g01Zm7d1iamAr8YKl6A7EDdw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>正因为如此，容器技术受到了热烈的欢迎和追捧，发展迅速。</p><p>我们具体来看看Docker。</p><p>大家需要注意，Docker本身并不是容器，它是创建容器的工具，是应用容器引擎。</p><p>想要搞懂Docker，其实看它的两句口号就行。</p><p>第一句，是“Build, Ship and Run”。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd9m78eY6pVet5tAmDdXzS1IQ7sDibOWiaBdf4AWnffQeeDUa8yybWiayDw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>也就是，“搭建、发送、运行”，三板斧。</p><p>举个例子：</p><p>我来到一片空地，想建个房子，于是我搬石头、砍木头、画图纸，一顿操作，终于把这个房子盖好了。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdUt1l8wG2OWaA5ib3xgR5LQE597j5f4CxqEWVcjw371icfjjFMsG2eaVg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>结果，我住了一段时间，想搬到另一片空地去。这时候，按以往的办法，我只能再次搬石头、砍木头、画图纸、盖房子。</p><p>但是，跑来一个老巫婆，教会我一种魔法。</p><p>这种魔法，可以把我盖好的房子复制一份，做成“镜像”，放在我的背包里。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd3Pj0EEua4h58OibBQQ4MYCuI1WvRyeUKOXUhPDVWKdgwRXQGibc1uVCg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>等我到了另一片空地，就用这个“镜像”，复制一套房子，摆在那边，拎包入住。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdkPJAno2WqWW8RGu1w6EIYtxraa6nE4hkKgHrJw8NviaWH7PGiaPDibD0A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>怎么样？是不是很神奇？</p><p>所以，Docker的第二句口号就是：“Build once，Run anywhere（搭建一次，到处能用）”。</p><p>Docker技术的三大核心概念，分别是：</p><p>镜像（Image） 容器（Container） 仓库（Repository）</p><p>我刚才例子里面，那个放在包里的“镜像”，就是Docker镜像。而我的背包，就是Docker仓库。我在空地上，用魔法造好的房子，就是一个Docker容器。</p><p>说白了，这个Docker镜像，是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数（例如环境变量）。镜像不包含任何动态数据，其内容在构建之后也不会被改变。</p><p>也就是说，每次变出房子，房子是一样的，但生活用品之类的，都是不管的。谁住谁负责添置。</p><p>每一个镜像可以变出一种房子。那么，我可以有多个镜像呀！</p><p>也就是说，我盖了一个欧式别墅，生成了镜像。另一个哥们可能盖了一个中国四合院，也生成了镜像。还有哥们，盖了一个非洲茅草屋，也生成了镜像。。。</p><p>这么一来，我们可以交换镜像，你用我的，我用你的，岂不是很爽？</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd4avJHl9gOBcfk8h5so63naaJxfpmBWmHAqgO2NKOlQL6Q8olwNENHQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>于是乎，就变成了一个大的公共仓库。</p><p>负责对Docker镜像进行管理的，是Docker Registry服务（类似仓库管理员）。</p><p>不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢？</p><p>所以，Docker Registry服务对镜像的管理是非常严格的。</p><p>最常使用的Registry公开服务，是官方的Docker Hub，这也是默认的 Registry，并拥有大量的高质量的官方镜像。</p><p>好了，说完了Docker，我们再把目光转向K8S。</p><p>就在Docker容器技术被炒得热火朝天之时，大家发现，如果想要将Docker应用于具体的业务实现，是存在困难的——编排、管理和调度等各个方面，都不容易。于是，人们迫切需要一套管理系统，对Docker及容器进行更高级更灵活的管理。</p><p>就在这个时候，K8S出现了。</p><p>K8S，就是基于容器的集群管理平台，它的全称，是kubernetes。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdM19VQMQyWtASjB5CBNmTNdYplQTummrC04icMz2fg5MLxTIoNPEmo9w/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>Kubernetes 这个单词来自于希腊语，含义是舵手或领航员。K8S是它的缩写，用“8”字替代了“ubernete”这8个字符。</p><p>和Docker不同，K8S的创造者，是众人皆知的行业巨头——Google。</p><p>然而，K8S并不是一件全新的发明。它的前身，是Google自己捣鼓了十多年的Borg系统。</p><p>K8S是2014年6月由Google公司正式公布出来并宣布开源的。</p><p>同年7月，微软、Red Hat、IBM、Docker、CoreOS、 Mesosphere和Saltstack 等公司，相继加入K8S。</p><p>之后的一年内，VMware、HP、Intel等公司，也陆续加入。</p><p>2015年7月，Google正式加入OpenStack基金会。与此同时，Kuberentes v1.0正式发布。</p><p>目前，kubernetes的版本已经发展到V1.13。</p><p>K8S的架构，略微有一点复杂，我们简单来看一下。</p><p>一个K8S系统，通常称为一个K8S集群（Cluster）。</p><p>这个集群主要包括两个部分：</p><p>一个Master节点（主节点） 一群Node节点（计算节点）</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdMc60uPY6ymZe0zqibbV16K7yC94R0E0FFXCuVl0VibEHtNp6UvcSiayibw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>一看就明白：Master节点主要还是负责管理和控制。Node节点是工作负载节点，里面是具体的容器。</p><p>深入来看这两种节点。</p><p>首先是Master节点。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdoWhcWZMkn5N65OEIBdicxCMWXoafkhdcGk7koTqw6qzfxKmdSEX6eFA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>Master节点包括API Server、Scheduler、Controller manager、etcd。</p><p>API Server是整个系统的对外接口，供客户端和其它组件调用，相当于“营业厅”。</p><p>Scheduler负责对集群内部的资源进行调度，相当于“调度室”。</p><p>Controller manager负责管理控制器，相当于“大总管”。</p><p>然后是Node节点。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd6nACOMFBdiaPU9iaAtbxGHrKibDx65WyERpSQl6ztRmRZ07B0KtV3wI8g/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>Node节点包括Docker、kubelet、kube-proxy、Fluentd、kube-dns（可选），还有就是Pod。</p><p>Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程，它内部封装了一个或多个紧密相关的容器。除了Pod之外，K8S还有一个Service的概念，一个Service可以看作一组提供相同服务的Pod的对外访问接口。这段不太好理解，跳过吧。</p><p>Docker，不用说了，创建容器的。</p><p>Kubelet，主要负责监视指派到它所在Node上的Pod，包括创建、修改、监控、删除等。</p><p>Kube-proxy，主要负责为Pod对象提供代理。</p><p>Fluentd，主要负责日志收集、存储与查询。</p><p>是不是有点懵？唉，三言两语真的很难讲清楚，继续跳过吧。</p><p>Docker和K8S都介绍完了，然而文章并没有结束。</p><p>接下来的部分，是写给核心网工程师甚至所有通信工程师看的。</p><p>从几十年前的1G，到现在的4G，再到将来的5G，移动通信发生了翻天覆地的变化，核心网亦是如此。</p><p>但是，如果你仔细洞察这些变化，会发现，所谓的核心网，其实本质上并没有发生改变，无非就是很多的服务器而已。不同的核心网网元，就是不同的服务器，不同的计算节点。</p><p>变化的，是这些“服务器”的形态和接口：形态，从机柜单板，变成机柜刀片，从机柜刀片，变成X86通用刀片服务器；接口，从中继线缆，变成网线，从网线，变成光纤。</p><p>就算变来变去，还是服务器，是计算节点，是CPU。</p><p>既然是服务器，那么就势必会和IT云计算一样，走上虚拟化的道路。毕竟，虚拟化有太多的优势，例如前文所说的低成本、高利用率、充分灵活、动态调度，等等。</p><p>前几年，大家以为虚拟机是核心网的终极形态。目前看来，更有可能是容器化。这几年经常说的NFV（网元功能虚拟化），也有可能改口为NFC（网元功能容器化）。</p><p>以VoLTE为例，如果按以前2G/3G的方式，那需要大量的专用设备，分别充当EPC和IMS的不同网元。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBd6SkTz0dCM4CjribvCuvp1WPUMpDDgp0NjmSLsZsKprU0FibS6ahsEbHw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>VoLTE相关的网元</p><p>而采用容器之后，很可能只需要一台服务器，创建十几个容器，用不同的容器，来分别运行不同网元的服务程序。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdYw9dBrXJUxsZEfic26QLRDRo3q40kqicHBBtrPclFSibJibalSsnDRw75A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>这些容器，随时可以创建，也可以随时销毁。还能够在不停机的情况下，随意变大，随意变小，随意变强，随意变弱，在性能和功耗之间动态平衡。</p><p>简直完美！</p><p>5G时代，核心网采用微服务架构，也是和容器完美搭配——单体式架构（Monolithic）变成微服务架构（Microservices），相当于一个全能型变成N个专能型。每个专能型，分配给一个隔离的容器，赋予了最大程度的灵活。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBdMEYjVVzucq8JceZl7U84DmWr3Ucra4rplgqia9Jl5qLq6gHU0KoOkJg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>精细化分工</p><p>按照这样的发展趋势，在移动通信系统中，除了天线，剩下的部分都有可能虚拟化。核心网是第一个，但不是最后一个。虚拟化之后的核心网，与其说属于通信，实际上更应该归为IT。核心网的功能，只是容器中普通一个软件功能而已。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/rLGOIHABwEqYNaicmtJwy21tiaUqoatfBduibf3KMweC6HTlXibeyfDNhJnQL4rMoc1OD4npHUGlaO4v2XuNiaRkTfA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>看完这个故事，有什么想说的吗？哈哈。现在给大家总结总结。</p><h2 id="k8s和docker-的区别" tabindex="-1">k8s和docker 的区别 <a class="header-anchor" href="#k8s和docker-的区别" aria-label="Permalink to &quot;k8s和docker 的区别&quot;">​</a></h2><p>docker是一种开放源码应用容器引擎，开发人员可以将其应用打包，发布到流行的 liunx系统或实现虚拟化。</p><blockquote><p>k8s是一种开放源码的容器集群管理系统，可实现自动化部署、扩展容量、维护等容器集群功能。Docker容器有别于传统虚拟化方法，传统的虚拟技术，在将物理硬件虚拟为多套硬件之后，需要在每套硬件上分别部署一个操作系统，然后在这些操作系统上运行相应的应用程序。docker-compose up- d是一个容器。dockerfilebuild是一个镜像。dockerfile是自己定义自己的镜像功能。</p></blockquote><blockquote><p>传统的方法是直接在同一个物理机器节点上部署所有应用，因此，每个 App的依赖性是完全相同的，不能实现 App之间的隔离，当然，为了隔离，我们也可以通过创建虚拟机的方式将 App部署到其中，但是这样做过于繁琐，因此 Docker技术要比虚拟机更轻，现在我们通过部署 Container容器的技术来部署应用程序，让所有 Container运行在容器引擎上。容器集群管理系统以 kubernetes为代表，使用 kubernetes来管理 Docker集群，也就是说， Docker可以被看作是 Kubernetes内部使用的低级组件。此外， kubernetes不仅支持 Docker，也支持 Rocket，这是另一种容器技术。</p></blockquote><blockquote><p>而且 Docker 容器中的应用程序进程直接运行在宿主机(真实的物理机)的内核上， Docker引擎将一些各自独立的应用程序打包，它们各自独立地独立地运行于未虚拟化的宿主硬件上，同时每个容器都没有自己的内核，显然比传统虚拟机更轻。</p></blockquote></div></div></main><footer class="VPDocFooter" data-v-6b87e69f data-v-37656e44><!--[--><!--]--><!----><nav class="prev-next" data-v-37656e44><div class="pager" data-v-37656e44><a class="pager-link prev" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/Docker.html" data-v-37656e44><span class="desc" data-v-37656e44>Previous page</span><span class="title" data-v-37656e44>Docker</span></a></div><div class="pager" data-v-37656e44><a class="pager-link next" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E5%9F%BA%E7%A1%80.html" data-v-37656e44><span class="desc" data-v-37656e44>Next page</span><span class="title" data-v-37656e44>监控基础</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"2、数据库_mysql_mysql面试_基础.md\":\"40da680a\",\"1、学前端_5、小程序_小程序项目.md\":\"60a1629b\",\"1、学前端_4、node_知识篇.md\":\"a7fb500e\",\"1、学前端_2、js_ts_es6 进阶.md\":\"6d07ba10\",\"1、学前端_3、vue_vue3_vue3进阶.md\":\"7ac622b4\",\"5、运维_jenkins.md\":\"929081f8\",\"1、学前端_2、js_ts_typescript.md\":\"875a4aa4\",\"2、数据库_mysql_mysql核心_设计.md\":\"7faf46d1\",\"2、数据库_mysql_mysql核心_基础.md\":\"d8e97f3e\",\"1、学前端_1、html_css_html基础.md\":\"7584d076\",\"1、学前端_5、专题篇_问题篇.md\":\"e893aaa2\",\"2、数据库_mysql_mysql面试_进阶.md\":\"f934806d\",\"3、springboot_运维_原理.md\":\"f4a39db6\",\"2、数据库_influxdb.md\":\"6e1711e1\",\"3、springboot_新特性.md\":\"cdf3e307\",\"mybatis_mybatisplus_jpa.md\":\"8e41681b\",\"1、学前端_5、小程序_小程序优化.md\":\"a2185198\",\"2、数据库_redis_redis基础.md\":\"856df0e0\",\"linux_实用脚本.md\":\"f2299dd5\",\"4、微服务_必备_分布式基础.md\":\"d49863d5\",\"2、数据库_redis_redis优化.md\":\"e66ae32f\",\"4、微服务_springsecurity_进阶篇.md\":\"235a8e9e\",\"5、运维_chatgpt.md\":\"10db3823\",\"2、数据库_mysql_分库分表.md\":\"e1c8a095\",\"start.md\":\"9bc1ff8d\",\"5、运维_github.md\":\"2ec6c735\",\"java学前端_css.md\":\"f11b47f0\",\"1、学前端_5、专题篇_知识篇.md\":\"a463ed8d\",\"linux_软件部署.md\":\"d6722925\",\"2、数据库_neo4j.md\":\"97ad22ac\",\"team.md\":\"ce467a6a\",\"nginx_实战篇.md\":\"7785486e\",\"index.md\":\"8c3ec167\",\"计算机基础_计算机网络_网络基础.md\":\"7a54a85d\",\"1、学前端_4、node_进阶篇.md\":\"60f6db69\",\"java_java集合.md\":\"a049b313\",\"1、学前端_3、vue_vue3_vue3高级.md\":\"614d1516\",\"1、学前端_5、小程序_微信小程序.md\":\"9a4be771\",\"5、运维_netty.md\":\"12ca0278\",\"2、数据库_mysql_mysql核心_运维.md\":\"83f97c16\",\"idea_vs code.md\":\"afdcb593\",\"java学前端_vue3_组件.md\":\"1086884e\",\"idea_chrome.md\":\"4a32afbc\",\"云原生_k8s.md\":\"db58e65a\",\"2、数据库_mysql_mysql核心_进阶.md\":\"61d16dff\",\"ssm_springbatch.md\":\"f799ab4a\",\"三高_分布式.md\":\"db1b8a1b\",\"2、数据库_elasticsearch_1、es基础.md\":\"04d17448\",\"linux_linux基础.md\":\"4b0bf394\",\"idea_idea插件.md\":\"fa86e45a\",\"可视化 _ 监控_可视化大屏.md\":\"004553bd\",\"2、数据库_mongodb_整合.md\":\"3c47d7f4\",\"4、微服务_springsecurity_基础篇.md\":\"534a3401\",\"4、微服务_进阶.md\":\"69095c58\",\"计算机基础_计算机基础_操作系统.md\":\"0f75d113\",\"可视化 _ 监控_zabbix.md\":\"71f2270e\",\"nginx_基础篇.md\":\"c7d8bb50\",\"1、学前端_4、node_项目实战.md\":\"bc5065b8\",\"2、数据库_redis_redis原理.md\":\"5cedf685\",\"可视化 _ 监控_监控基础.md\":\"ac56ce4d\",\"三高_高并发.md\":\"ea9ffc99\",\"2、数据库_redis_redis高级.md\":\"1d5872f6\",\"1、学前端_4、node_基础篇.md\":\"581cc13a\",\"2、数据库_mongodb_基础.md\":\"fb7a0a29\",\"idea_idea基础.md\":\"6f2f9638\",\"4、微服务_必备_sentinel.md\":\"2edfbf6c\",\"2、数据库_elasticsearch_3、es高级.md\":\"ef146606\",\"1、学前端_3、vue_vue3_vue3新语法.md\":\"8afd5409\",\"消息中间件_canal.md\":\"3949163c\",\"ssm_maven.md\":\"2c5e12ed\",\"4、微服务_springsecurity_高级篇.md\":\"882d3ff3\",\"linux_linux进阶.md\":\"188ef7b4\",\"计算机基础_设计模式_uml.md\":\"634ba256\",\"计算机基础_算法_leetcode.md\":\"77162fb9\",\"项目实战_小兔鲜_进阶篇1.md\":\"17c52c81\",\"1、学前端_2、js_ts_es6 基础.md\":\"fda3f18b\",\"项目实战_小兔鲜_进阶篇2.md\":\"a0f23006\",\"软件测试_测试基础.md\":\"8c1060cd\",\"2、数据库_redis_本地缓存.md\":\"00617fe6\",\"nginx_面试篇.md\":\"e3fb373a\",\"mybatis_mybatisplus_mybatis.md\":\"9239e0ad\",\"linux_shell.md\":\"ae53d83b\",\"2、数据库_mysql_mysql核心_优化.md\":\"36230425\",\"项目实战_项目推荐.md\":\"f9d97630\",\"mybatis_mybatisplus_mybatisplus.md\":\"0030fd35\",\"项目实战_百度地图_进阶篇.md\":\"c8b93267\",\"三高_高可用.md\":\"323840c5\",\"java_java新特性.md\":\"22abf56d\",\"软件测试_压力测试.md\":\"9ab44440\",\"java学前端_html_js.md\":\"e0fcd240\",\"2、数据库_redis_redis实战.md\":\"d6daeeab\",\"nginx_进阶篇.md\":\"e6b63195\",\"三高_秒杀.md\":\"3878bb64\",\"5、运维_git.md\":\"0264925c\",\"java_java进阶.md\":\"e79cb5b4\",\"并发 _ 多线程_基础篇.md\":\"7adbfac5\",\"项目实战_百度地图_基础篇.md\":\"8afa5954\",\"java学前端_react.md\":\"3ec827dd\",\"1、学前端_1、html_css_css基础.md\":\"01b56712\",\"项目实战_小兔鲜_基础篇.md\":\"646f5df5\",\"1、学前端_2、js_ts_js 基础.md\":\"cb13e36f\",\"可视化 _ 监控_监控进阶.md\":\"0cdbc292\",\"计算机基础_设计模式_基础篇.md\":\"51617287\",\"计算机基础_数据结构_基础篇.md\":\"b2bfd8d4\",\"项目实战_苍穹外卖_进阶篇.md\":\"48415e41\",\"ssm_spring.md\":\"ab514659\",\"消息中间件_rabbitmq.md\":\"45b1eb28\",\"1、学前端_1、html_css_网页进阶.md\":\"db998248\",\"消息中间件_kafka.md\":\"b747dabf\",\"云原生_docker.md\":\"983c7ba7\",\"4、微服务_必备_分布式锁.md\":\"5af1cf8d\",\"消息中间件_rocketmq.md\":\"d441da85\",\"项目实战_黑马头条_基础篇.md\":\"b05af3a6\",\"ssm_springmvc.md\":\"81b9714f\",\"项目实战_支付.md\":\"1d7407dd\",\"项目实战_黑马头条_进阶篇2.md\":\"bff0015b\",\"项目实战_黑马头条_进阶篇.md\":\"19f18388\",\"java学前端_vue2_组件.md\":\"58c6b1df\",\"3、springboot_基础篇.md\":\"529c66f4\",\"3、springboot_应用篇.md\":\"8b92aa61\",\"项目实战_黑马头条_高级篇.md\":\"227c08c1\",\"1、学前端_5、小程序_uniapp.md\":\"71a282b4\",\"项目实战_云尚办公_基础篇.md\":\"1fe188ba\",\"并发 _ 多线程_并发完善.md\":\"26619c46\",\"1、学前端_2、js_ts_js 进阶.md\":\"657dfb8f\",\"java_java高级.md\":\"23782d1a\",\"java_java基础.md\":\"86d67c77\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"VitePress\",\"description\":\"A VitePress site\",\"base\":\"/notebook/\",\"head\":[],\"appearance\":true,\"themeConfig\":{\"algolia\":{\"appId\":\"DW7O63I9IR\",\"apiKey\":\"f8ed758cdb288a8b06542bc35923c1a1\",\"indexName\":\"notebook\"},\"sidebar\":[{\"text\":\"Java\",\"collapsed\":true,\"items\":[{\"text\":\"Java基础\",\"link\":\"/Java/Java基础\"},{\"text\":\"Java新特性\",\"link\":\"/Java/Java新特性\"},{\"text\":\"Java进阶\",\"link\":\"/Java/Java进阶\"},{\"text\":\"Java集合\",\"link\":\"/Java/Java集合\"},{\"text\":\"Java高级\",\"link\":\"/Java/Java高级\"}]},{\"text\":\"Linux\",\"collapsed\":true,\"items\":[{\"text\":\"Linux基础\",\"link\":\"/Linux/Linux基础\"},{\"text\":\"Linux新特性\",\"link\":\"/Linux/Linux进阶\"},{\"text\":\"Shell脚本\",\"link\":\"/Linux/Shell\"},{\"text\":\"实用脚本\",\"link\":\"/Linux/实用脚本\"},{\"text\":\"软件部署\",\"link\":\"/Linux/软件部署\"}]},{\"text\":\"Nginx\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/Nginx/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/Nginx/进阶篇\"},{\"text\":\"实战篇\",\"link\":\"/Nginx/实战篇\"},{\"text\":\"面试篇\",\"link\":\"/Nginx/面试篇\"}]},{\"text\":\"SSM\",\"collapsed\":true,\"items\":[{\"text\":\"Maven\",\"link\":\"/SSM/Maven\"},{\"text\":\"Spring\",\"link\":\"/SSM/Spring\"},{\"text\":\"SpringMVC\",\"link\":\"/SSM/SpringMVC\"},{\"text\":\"SpringBatch\",\"link\":\"/SSM/SpringBatch\"}]},{\"text\":\"SpringBoot\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/3、SpringBoot/基础篇\"},{\"text\":\"应用篇\",\"link\":\"/3、SpringBoot/应用篇\"},{\"text\":\"新特性\",\"link\":\"/3、SpringBoot/新特性\"},{\"text\":\"运维&原理\",\"link\":\"/3、SpringBoot/运维&原理\"}]},{\"text\":\"SpringCloud\",\"collapsed\":true,\"items\":[{\"text\":\"SpringCloud\",\"link\":\"/4、微服务/进阶\"},{\"text\":\"Sentinel\",\"link\":\"/4、微服务/必备/Sentinel\"}]},{\"text\":\"SpringSecurity\",\"collapsed\":true,\"items\":[{\"text\":\"SpringSecurity基础篇\",\"link\":\"/4、微服务/SpringSecurity/基础篇\"},{\"text\":\"SpringSecurity进阶篇\",\"link\":\"/4、微服务/SpringSecurity/进阶篇\"},{\"text\":\"SpringSecurity高级篇\",\"link\":\"/4、微服务/SpringSecurity/高级篇\"}]},{\"text\":\"Mybatis & MybatisPlus\",\"collapsed\":true,\"items\":[{\"text\":\"Mybatis\",\"link\":\"/Mybatis&MybatisPlus/Mybatis\"},{\"text\":\"MybatisPlus\",\"link\":\"/Mybatis&MybatisPlus/MybatisPlus\"},{\"text\":\"JPA\",\"link\":\"/Mybatis&MybatisPlus/JPA\"}]},{\"text\":\"Git & ChatGPT\",\"collapsed\":true,\"items\":[{\"text\":\"Git\",\"link\":\"/5、运维/Git\"},{\"text\":\"Github\",\"link\":\"/5、运维/Github\"},{\"text\":\"ChatGPT\",\"link\":\"/5、运维/ChatGPT\"},{\"text\":\"Jenkins\",\"link\":\"/5、运维/Jenkins\"},{\"text\":\"Netty\",\"link\":\"/5、运维/Netty\"}]},{\"text\":\"数据库\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL基础\",\"link\":\"/2、数据库/MySQL/MySQL核心/基础\"},{\"text\":\"MySQL进阶\",\"link\":\"/2、数据库/MySQL/MySQL核心/进阶\"},{\"text\":\"MySQL优化\",\"link\":\"/2、数据库/MySQL/MySQL核心/优化\"},{\"text\":\"MySQL设计\",\"link\":\"/2、数据库/MySQL/MySQL核心/设计\"},{\"text\":\"MySQL运维\",\"link\":\"/2、数据库/MySQL/MySQL核心/运维\"},{\"text\":\"分库分表\",\"link\":\"/2、数据库/MySQL/分库分表\"}]},{\"text\":\"Redis\",\"collapsed\":true,\"items\":[{\"text\":\"Redis基础\",\"link\":\"/2、数据库/Redis/Redis基础\"},{\"text\":\"Redis优化\",\"link\":\"/2、数据库/Redis/Redis优化\"},{\"text\":\"Redis原理\",\"link\":\"/2、数据库/Redis/Redis原理\"},{\"text\":\"Redis高级\",\"link\":\"/2、数据库/Redis/Redis高级\"},{\"text\":\"Redis实战\",\"link\":\"/2、数据库/Redis/Redis实战\"},{\"text\":\"本地缓存\",\"link\":\"/2、数据库/Redis/本地缓存\"}]},{\"text\":\"MongoDB\",\"collapsed\":true,\"items\":[{\"text\":\"MongoDB基础\",\"link\":\"/2、数据库/MongoDB/基础\"},{\"text\":\"MongoDB进阶\",\"link\":\"/2、数据库/MongoDB/整合\"}]},{\"text\":\"ElasticSearch\",\"collapsed\":true,\"items\":[{\"text\":\"ES基础\",\"link\":\"/2、数据库/ElasticSearch/1、ES基础\"},{\"text\":\"ES高级\",\"link\":\"/2、数据库/ElasticSearch/3、ES高级\"}]},{\"text\":\"InfluxDB\",\"link\":\"/2、数据库/influxdb\"},{\"text\":\"Neo4j\",\"link\":\"/2、数据库/Neo4j\"}]},{\"text\":\"高并发 & 秒杀 & 分布式\",\"collapsed\":true,\"items\":[{\"text\":\"分布式理论\",\"link\":\"/三高/分布式\"},{\"text\":\"分布式锁\",\"link\":\"/4、微服务/必备/分布式锁\"},{\"text\":\"秒杀\",\"link\":\"/三高/秒杀\"},{\"text\":\"高可用\",\"link\":\"/三高/高可用\"},{\"text\":\"高并发\",\"link\":\"/三高/高并发\"}]},{\"text\":\"云原生\",\"collapsed\":true,\"items\":[{\"text\":\"Docker\",\"link\":\"/云原生/Docker\"},{\"text\":\"K8S\",\"link\":\"/云原生/K8S\"}]},{\"text\":\"可视化 & 监控\",\"collapsed\":true,\"items\":[{\"text\":\"监控基础\",\"link\":\"/可视化 & 监控/监控基础\"},{\"text\":\"监控进阶\",\"link\":\"/可视化 & 监控/监控进阶\"},{\"text\":\"可视化大屏\",\"link\":\"/可视化 & 监控/可视化大屏\"},{\"text\":\"Zabbix\",\"link\":\"/可视化 & 监控/Zabbix\"}]},{\"text\":\"学前端\",\"collapsed\":true,\"items\":[{\"text\":\"HTML+CSS\",\"collapsed\":true,\"items\":[{\"text\":\"HTML基础\",\"link\":\"/1、学前端/1、HTML+CSS/HTML基础\"},{\"text\":\"CSS基础\",\"link\":\"/1、学前端/1、HTML+CSS/CSS基础\"},{\"text\":\"网页进阶\",\"link\":\"/1、学前端/1、HTML+CSS/网页进阶\"}]},{\"text\":\"JS+TS\",\"collapsed\":true,\"items\":[{\"text\":\"JS基础\",\"link\":\"/1、学前端/2、JS+TS/JS 基础\"},{\"text\":\"JS进阶\",\"link\":\"/1、学前端/2、JS+TS/JS 进阶\"},{\"text\":\"ES6基础\",\"link\":\"/1、学前端/2、JS+TS/ES6 基础\"},{\"text\":\"ES6进阶\",\"link\":\"/1、学前端/2、JS+TS/ES6 进阶\"},{\"text\":\"TS基础\",\"link\":\"/1、学前端/2、JS+TS/TypeScript\"}]},{\"text\":\"NodeJS\",\"collapsed\":true,\"items\":[{\"text\":\"Node基础\",\"link\":\"/1、学前端/4、Node/基础篇\"},{\"text\":\"Node进阶\",\"link\":\"/1、学前端/4、Node/进阶篇\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/4、Node/项目实战\"}]},{\"text\":\"Vue\",\"collapsed\":true,\"items\":[{\"text\":\"Vue3进阶\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3进阶\"},{\"text\":\"Vue3高级\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3高级\"},{\"text\":\"Vue3新语法\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3新语法\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/3、Vue/Vue2/Vue2项目\"}]},{\"text\":\"小程序\",\"collapsed\":true,\"items\":[{\"text\":\"小程序基础\",\"link\":\"/1、学前端/5、小程序/微信小程序\"},{\"text\":\"小程序优化\",\"link\":\"/1、学前端/5、小程序/小程序优化\"},{\"text\":\"uniapp\",\"link\":\"/1、学前端/5、小程序/uniapp\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/5、小程序/小程序项目\"}]}]},{\"text\":\"计算机基础\",\"collapsed\":true,\"items\":[{\"text\":\"数据结构\",\"link\":\"/计算机基础/数据结构/基础篇\"},{\"text\":\"操作系统\",\"link\":\"/计算机基础/计算机基础/操作系统\"},{\"text\":\"设计模式\",\"link\":\"/计算机基础/设计模式/基础篇\"},{\"text\":\"计算机网络\",\"link\":\"/计算机基础/计算机网络/网络基础\"},{\"text\":\"UML\",\"link\":\"/计算机基础/设计模式/UML\"},{\"text\":\"LeetCode\",\"link\":\"/计算机基础/算法/LeetCode\"}]},{\"text\":\"项目实战\",\"collapsed\":true,\"items\":[{\"text\":\"云尚办公\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/云尚办公/基础篇\"}]},{\"text\":\"小兔鲜\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/小兔鲜/基础篇\"},{\"text\":\"进阶篇1\",\"link\":\"/项目实战/小兔鲜/进阶篇1\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/小兔鲜/进阶篇2\"}]},{\"text\":\"地图\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/百度地图/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/百度地图/进阶篇\"}]},{\"text\":\"苍穹外卖\",\"collapsed\":true,\"items\":[{\"text\":\"进阶篇\",\"link\":\"/项目实战/苍穹外卖/进阶篇\"}]},{\"text\":\"黑马头条\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/黑马头条/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/黑马头条/进阶篇\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/黑马头条/进阶篇2\"},{\"text\":\"高级篇\",\"link\":\"/项目实战/黑马头条/高级篇\"}]},{\"text\":\"支付\",\"link\":\"/项目实战/支付\"},{\"text\":\"项目推荐\",\"link\":\"/项目实战/项目推荐\"}]},{\"text\":\"团队成员\",\"link\":\"/team\"}],\"siteTitle\":\"任硕的文档\",\"logo\":\"/Vue.png\",\"nav\":[{\"text\":\"Java学前端\",\"items\":[{\"items\":[{\"text\":\"HTML+JS\",\"link\":\"/Java学前端/HTML+JS\"},{\"text\":\"CSS\",\"link\":\"/Java学前端/CSS\"},{\"text\":\"Vue2+组件\",\"link\":\"/Java学前端/Vue2+组件\"},{\"text\":\"Vue3+组件\",\"link\":\"/Java学前端/Vue3+组件\"},{\"text\":\"React\",\"link\":\"/Java学前端/React\"}]}],\"activeMatch\":\"/Java/\"},{\"text\":\"软件测试\",\"items\":[{\"items\":[{\"text\":\"测试基础\",\"link\":\"/软件测试/测试基础\"},{\"text\":\"压力测试\",\"link\":\"/软件测试/压力测试\"}]}]},{\"text\":\"多线程\",\"items\":[{\"items\":[{\"text\":\"基础篇\",\"link\":\"/并发 & 多线程/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/并发 & 多线程/并发完善\"}]}]},{\"text\":\"开发工具\",\"items\":[{\"items\":[{\"text\":\"Chrome\",\"link\":\"/IDEA/Chrome\"},{\"text\":\"IDEA基础\",\"link\":\"/IDEA/IDEA基础\"},{\"text\":\"IDEA插件\",\"link\":\"/IDEA/IDEA插件\"},{\"text\":\"VS Code\",\"link\":\"/IDEA/VS Code\"}]}]},{\"text\":\"消息中间件\",\"items\":[{\"items\":[{\"text\":\"RabbitMQ\",\"link\":\"/消息中间件/RabbitMQ\"},{\"text\":\"RocketMQ\",\"link\":\"/消息中间件/RocketMQ\"},{\"text\":\"Kafka\",\"link\":\"/消息中间件/Kafka\"},{\"text\":\"Canal\",\"link\":\"/消息中间件/Canal\"}]}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/renshuo123/renshuo123.github.io\"},{\"icon\":\"twitter\",\"link\":\"#\"},{\"icon\":{\"svg\":\"<svg t=\\\"1676028692954\\\" class=\\\"icon\\\" ...</path></svg>\"},\"link\":\"https://github.com/\"}]},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
    
  </body>
</html>